[英]How to sort a List of items based on dateTime in Flutter | Flutter
[英]How do I sort items in a list by DateTime in Flutter/Dart?
我正在為我的叔叔制作一個應用程序,他要我來挑戰我。 我認為這是學習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)),
],
),
),
),
);
}
}
實際上,這可以通過兩種方式完成。 一種是通過編程方式對條目列表進行排序,而另一種則是從存儲位置將它們排序。
在大多數情況下,我認為最好從存儲它們的數據庫中獲取排序的項目。 同樣,只顯示今天或最喜歡的商品也是如此。 這取決於您使用的數據庫-但是例如,如果您使用的是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)....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.