Firebaseanimatedlist: Как я могу отображать имя пользователя / дату только один раз для последующих элементов списка (чат)?
Я получаю данные через FirebaseAnimatedList + Firebase Realtime Database в чате. Это групповой чат со многими пользователями. Рассмотрим похожий код, подобный этому, где Firebaseanimatedlist автоматически прослушивает новые элементы, которые затем отображаются.
В настоящее время каждый элемент списка имеет аватар, автора, текст (я также добавил дату и время).
Я хочу добиться 2 вещей (аналогично, например, WhatsApp): 1. Показывать дату только один раз как "заголовок / тост" в чате для сообщений с этой датой и временем в каждом сообщении (например, 8 февраля: сообщение 1 (время), сообщение 2 (время), ... 9 февраля сообщение 1 (время), сообщение 2 (время), ... 2. Я хочу, чтобы, когда есть последующие сообщения того же автора, что автор и его аватар только отображается один раз над первым сообщением, и поле этих сообщений меньше. WhatsApp использует обе функции.
new FirebaseAnimatedList(
query: reference,
sort: (a, b) => b.key.compareTo(a.key),
padding: new EdgeInsets.all(8.0),
reverse: true,
itemBuilder: (_, DataSnapshot snapshot, Animation<double> animation) {
return new ChatMessage(
snapshot: snapshot,
animation: animation
);
},
),
где ChatMessage выглядит так
class ChatMessage extends StatelessWidget {
ChatMessage({this.snapshot, this.animation});
final DataSnapshot snapshot;
final Animation animation;
Widget build(BuildContext context) {
return new SizeTransition(
sizeFactor: new CurvedAnimation(
parent: animation, curve: Curves.easeOut),
axisAlignment: 0.0,
child: new Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: new Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Container(
margin: const EdgeInsets.only(right: 16.0),
child: new CircleAvatar(backgroundImage: new NetworkImage(snapshot.value['senderPhotoUrl'])),
),
new Expanded(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Text(
snapshot.value['senderName'],
style: Theme.of(context).textTheme.subhead),
new Container(
margin: const EdgeInsets.only(top: 5.0),
child: snapshot.value['imageUrl'] != null ?
new Image.network(
snapshot.value['imageUrl'],
width: 250.0,
) :
new Text(snapshot.value['text']),
),
],
),
),
],
),
),
);
}
}