在flutter中如何将时间相同的内容放在一起显示,时间显示一次?
时间: 2024-02-23 12:01:25 浏览: 27
你可以使用 `ListView.separated` widget 和 `group by` 函数来实现将时间相同的内容放在一起显示,时间只显示一次的效果。具体步骤如下:
1. 首先,将你要显示的数据按照时间排序。
2. 然后,使用 `group by` 函数将数据按照时间分组。
3. 接着,将分组后的数据放入 `ListView.separated` widget 中,其中 `separatorBuilder` 参数用来定义分组之间的分隔符,`itemBuilder` 参数用来定义每个分组中时间相同的内容的显示方式。
4. 最后,在 `itemBuilder` 函数中,只需要显示每个分组的第一个元素的时间即可,因为时间相同的其他元素已经被分组在一起了。
下面是一段示例代码,仅供参考:
```dart
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';
class MyHomePage extends StatelessWidget {
final List<MyData> myDataList = [
MyData('2021-09-01', 'Content 1'),
MyData('2021-09-01', 'Content 2'),
MyData('2021-09-02', 'Content 3'),
MyData('2021-09-02', 'Content 4'),
MyData('2021-09-03', 'Content 5'),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My App'),
),
body: ListView.separated(
itemCount: groupBy(myDataList, (MyData myData) => myData.time)
.keys
.length,
separatorBuilder: (BuildContext context, int index) {
return Divider(thickness: 1);
},
itemBuilder: (BuildContext context, int index) {
final groupedList = groupBy(myDataList,
(MyData myData) => myData.time)[groupBy(myDataList,
(MyData myData) => myData.time).keys.toList()[index]];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
groupedList[0].time,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
),
ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: groupedList.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(groupedList[index].content),
);
},
),
],
);
},
),
);
}
}
class MyData {
final String time;
final String content;
MyData(this.time, this.content);
}
```
在这个示例中,我们将 `myDataList` 按照时间排序后,使用 `groupBy` 函数将它们按照时间分组。然后,将分组后的数据放入 `ListView.separated` widget 中,其中 `separatorBuilder` 参数使用 `Divider` widget 来定义分组之间的分隔符,`itemBuilder` 参数使用 `Column` 和 `ListView.builder` widgets 来定义每个分组中时间相同的内容的显示方式。在 `ListView.builder` 中,我们只需要显示每个分组的第一个元素的时间即可,因为时间相同的其他元素已经被分组在一起了。