我在实时聊天中通过 FirebaseAnimatedList + Firebase 实时数据库接收数据。这是与许多用户的群聊。考虑类似这样的代码,其中 Firebaseanimatedlist 自动侦听然后显示的新项目。
目前,每个列表项都有一个头像、作者、文本(我还添加了日期时间)。
我想实现两件事(类似于例如 WhatsApp): 1. 仅在聊天中将日期显示为“标题/祝酒词”一次,以显示该日期的消息和每条消息中的时间(例如 2 月 8 日:消息 1(时间) ,消息2(时间),...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']),
),
],
),
),
],
),
),
);
}
}