列表视图按日期分组 Dart
Posted
技术标签:
【中文标题】列表视图按日期分组 Dart【英文标题】:Listview group by date Dart 【发布时间】:2020-10-13 06:44:43 【问题描述】:我一直在尝试获取按日期排序的一些消息,但我无法正常工作。我尝试过不同的软件包,例如 grouped_list 和 sticky_headers。
使用sticky_headers,我设法在每个帖子上方添加了一个标题,但这不是我想要的。我想让消息按天排序。如下图所示:
下面我有一个数据集,其中包含从我的 API 获得的数据。我的目的是从 API 中获取 40 条消息。这 40 条消息按时间排序,只有消息必须在应用程序中按天分组,如上图所示。
编辑: 在玩了一些 sticky_header 包之后。我现在已经设法获得标题。只是不要设法获取正确标题下的消息。
数据集:
[
"time": "2020-06-16T10:31:12.000Z",
"message": "P2 BGM-01 HV buiten materieel (Gas lekkage) Franckstraat Arnhem 073631"
,
"time": "2020-06-16T10:29:35.000Z",
"message": "A1 Brahmslaan 3862TD Nijkerk 73278"
,
"time": "2020-06-16T10:29:35.000Z",
"message": "A2 NS Station Rheden Dr. Langemijerweg 6991EV Rheden 73286"
,
"time": "2020-06-15T09:41:18.000Z",
"message": "A2 VWS Utrechtseweg 6871DR Renkum 74636"
,
"time": "2020-06-14T09:40:58.000Z",
"message": "B2 5623EJ : Michelangelolaan Eindhoven Obj: ziekenhuizen 8610 Ca CATH route 522 PAAZ Rit: 66570"
]
【问题讨论】:
【参考方案1】:首先,分解代码以从数据集中按日期映射分组。然后使用此地图构建 UI。
使用collection包使用groupBy功能。
import "package:collection/collection.dart";
void main()
final dataSet = [
"time": "2020-06-16T10:31:12.000Z",
"message": "Message1",
,
"time": "2020-06-16T10:29:35.000Z",
"message": "Message2",
,
"time": "2020-06-15T09:41:18.000Z",
"message": "Message3",
,
];
var groupByDate = groupBy(dataSet, (obj) => obj['time'].substring(0, 10));
groupByDate.forEach((date, list)
// Header
print('$date:');
// Group
list.forEach((listItem)
// List item
print('$listItem["time"], $listItem["message"]');
);
// day section divider
print('\n');
);
输出:
2020-06-16:
2020-06-16T10:31:12.000Z, Message1
2020-06-16T10:29:35.000Z, Message2
2020-06-15:
2020-06-15T09:41:18.000Z, Message3
我希望这个 sn-p 将帮助您开始构建您的 UI。 您可以将ListView 小部件用于每个组中的列表项。
通过DateTime、DateFormat 类来处理日期、时间值。
【讨论】:
【参考方案2】:有一些名为 sticky_grouped_list 和 grouped_list 的 dart.pub 包(在您的问题中提到)。他们通过一个共同的属性围绕组元素做了很好的工作。我已经尝试过 sticky_grouped_list 并且除了我没有在您的特定场景中使用它之外,它似乎适用于它,一旦列表可以按动态类型对元素进行分组。
除了外观之外,您的代码和that example 之间的主要功能区别在于它们使用了 DateTime 元素而不是 String 作为对列表进行分组的更好方式。粘性组列表视图很有趣,因为当前日期在滚动时会停留在屏幕顶部。
instead of using a ListView create a GroupedListView Widget:
GroupedListView<dynamic, String>(
elements: _elements,
groupBy: (element) => element['group'],
groupSeparatorBuilder: (String groupByValue) => Text(groupByValue),
itemBuilder: (context, dynamic element) => Text(element['name']),
order: GroupedListOrder.ASC,
),
使用 StickyGroupedListView,您还可以按自定义对象进行分组:
StickyGroupedListView<CustomObject, DateTime>(
elements: pedidos,
order: StickyGroupedListOrder.ASC,
groupBy: (CustomObject element) => DateTime(
element.dateGroup.year,
element.dateGroup.month,
element.dateGroup.day),
groupSeparatorBuilder: (CustomObject element) =>
renderDataCabecalho(element),
itemBuilder: (context, element)
return _buildPedidoItemView(element, context);
,
),
如果它不适用于您的需求,您可能会了解他们对元素分组的方法。
【讨论】:
添加项目时会不断重新创建小部件 @Chickenchaser 这取决于你如何添加 itens。尝试使用 RXDart(BehaviorSubject 和 StreamBuilder)来控制它会更复杂。 @Chickenchaser 很高兴知道你成功了!【参考方案3】:如果 API 支持排序,则以正确的顺序获取结果将是最简单、性能最高的解决方案。
【讨论】:
API 不支持。然后我必须自己将它构建到 API 中。只有这样的问题是我如何让这些标题工作......谢谢你的回答! 在这种情况下,数据库查询(从 API 内发出)是否支持排序? 那将是最简单和最高效的解决方案。 是的,查询可以按日期排序。但是我必须检查何时必须显示新的标题日期 对不起,我刚刚再次阅读了您的问题,我认为您的措辞让我很失望。所以(只是确保我直截了当)你真正想知道的不是如何按天对消息进行排序,而是如何按天对消息进行分组。对吗? 哈哈,没关系。但这正是我想知道的!【参考方案4】:I think you should filter data in the model to create groups follow the date.
class ListDate
int id;
String name;
String date;
List<DateItem> results;
class DateItem
String id;
String date;
String name;
After parse JSON to model, you can run listView by ListDate().results
【讨论】:
以上是关于列表视图按日期分组 Dart的主要内容,如果未能解决你的问题,请参考以下文章