我正在为我的叔叔制作一个应用程序,他要求我制作此应用程序来挑战我。我认为这是学习Flutter / Dart的绝佳机会。我有下面的代码,但是我需要它通过DateTime来组织列表(第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)),
],
),
),
),
);
}
}
答案 0 :(得分:1)
实际上,这可以通过两种方式完成。一种是通过编程方式对条目列表进行排序,而另一种是从存储位置将它们排序。
在大多数情况下,我认为最好从存储它们的数据库中对这些项目进行排序。同样,只显示今天或最喜欢的商品也是如此。这取决于您使用的是哪个数据库-但是例如,如果您使用的是SQFlite,则可能是这样的:db.query(table, orderBy: "column_1 ASC, column_2 DESC");
如果column_1是您的日期,并且您想从最早到最新。这样一来,您也可以使用分页,这样就不必立即查询表中的所有项目,如果您要处理很多项目,这是一个好习惯。
如果项目数量很少(大多数电话应该能够轻松处理<1000个项目而不会导致UI停顿),则情况略有不同,并且直接在飞镖上进行项目是一种更可行的选择。
在这种情况下,您要做的就是根据日期对列表进行排序。
为此,您可以致电entries..sort((item1, item2) => item1.date.compareTo(item2.date))
并假设.date
是您要订购的日期。请注意,这将对同一列表进行内联排序-如果您不想更改原始列表,请先进行复制,即List.from(entries)....