如何在颤振/飞镖中按日期时间对列表中的项目进行排序?



我正在为我的叔叔制作一个应用程序,他让我制作这个应用程序来挑战我。我认为这是学习Flutter/Dart的绝佳机会。我有这段代码(如下),但我需要它来按日期时间(第 77 行)组织列表。每个条目至少都有一个字符串 ID、一个 DateTime 变量、一个字符串名称和一些正文文本。

import 'package:flutter/material.dart';
import 'package:gym_tracker/model/diary_entry.dart';
import 'package:gym_tracker/utils/store.dart';
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => new HomeScreenState();
}
class HomeScreenState extends State<HomeScreen> {
List<Entry> entries = getEntries();
List<String> userFavorites = getFavoritesIDs();
// Inactive widgets are going to call this method to
// signalize the parent widget HomeScreen to refresh the list view.
void _handleFavoritesListChanged(String entryID) {
// Set new state and refresh the widget:
setState(() {
if (userFavorites.contains(entryID)) {
userFavorites.remove(entryID);
} else {
userFavorites.add(entryID);
}
});
}
@override
Widget build(BuildContext context) {
Column _buildEntries(List<Entry> entriesList) {
return Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: entriesList.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(entriesList[index].name),
);
},
),
),
],
);
}
const double _iconSize = 20.0;
return DefaultTabController(
length: 4,
child: Scaffold(
appBar: PreferredSize(
// We set Size equal to passed height (50.0) and infinite width:
preferredSize: Size.fromHeight(50.0),
child: AppBar(
backgroundColor: Colors.white,
elevation: 2.0,
bottom: TabBar(
labelColor: Theme.of(context).indicatorColor,
tabs: [
Tab(icon: Icon(Icons.wb_sunny, size: _iconSize)),
Tab(icon: Icon(Icons.date_range, size: _iconSize)),
Tab(icon: Icon(Icons.bookmark, size: _iconSize)),
Tab(icon: Icon(Icons.settings, size: _iconSize)),
],
),
),
),
body: Padding(
padding: EdgeInsets.all(5.0),
child: TabBarView(
// Replace placeholders:
children: [
// Display entries today:
_buildEntries(entries.where((entry) => entry.dateTime.day == DateTime.now().day && entry.dateTime.month == DateTime.now().month && entry.dateTime.year == DateTime.now().year).toList()),
// Display all entries:
_buildEntries(entries.where((entry) => ).toList()), //Help Here Please!
// Display favorite entries:
_buildEntries(entries.where((entry) => userFavorites.contains(entry.id)).toList()),
Center(child: Icon(Icons.settings)),
],
),
),
),
);
}
}

实际上,这可以通过两种方式完成。一种是以编程方式对条目列表进行排序,而另一种是从存储条目的任何位置对它们进行排序。

在大多数情况下,我认为最好从存储它们的数据库中对项目进行排序。仅显示今天的那些或最喜欢的内容也是如此。这取决于您使用的数据库 - 但例如,如果您使用的是 SQFlite,它将是这样的:db.query(table, orderBy: "column_1 ASC, column_2 DESC");column_1是否是您的日期并且您希望从最旧到最新。这样做还允许您使用分页,这样您就不会一次查询表中的所有项目,如果您正在处理大量项目,这是一个很好的做法。

如果只有相当少的项目数量(大多数手机应该能够相当轻松地处理 <1000 个项目而不会导致任何 UI 卡顿),情况就有点不同了,直接在 dart 中对项目进行操作是一个更可行的选择。

在这种情况下,您需要做的就是根据日期对列表进行排序。

为此,您可以致电entries..sort((item1, item2) => item1.date.compareTo(item2.date))假设.date是您尝试订购的日期。请注意,这将对相同的列表进行内联排序 - 如果您不想更改原始列表,则首先制作一个副本,即List.from(entries)....

最新更新