Flutter Chat App: 使用 StreamBuilder 优化实时消息展示,避免闪屏
在实时展示消息时,闪屏的问题可能与 setState() 的调用过于频繁有关。可以考虑使用 StreamBuilder 来实现实时展示消息,避免频繁调用 setState()。具体修改如下:
- 定义 StreamController:
StreamController<List<types.Message>> _streamController = StreamController();
- 将 setState() 修改为向 _streamController 添加数据:
void _addMessage(types.Message message) {
final messages = List.from(Global.messages)..insert(0, message);
_streamController.add(messages);
Global.messages = messages;
}
- 在 build() 中使用 StreamBuilder 来实时展示消息:
StreamBuilder<List<types.Message>>(
stream: _streamController.stream,
initialData: Global.messages,
builder: (context, snapshot) {
return Chat(
messages: snapshot.data!,
onAttachmentPressed: _handleAttachmentPressed,
onMessageTap: _handleMessageTap,
onPreviewDataFetched: _handlePreviewDataFetched,
onSendPressed: _handleSendPressed,
onMessageDoubleTap: _handleMessageDoubleTap,
showUserAvatars: true,
l10n: ChatL10nZhCN(),
customMessageBuilder: (p0, {required messageWidth}) {
return Container(
width: messageWidth.toDouble(),
child: Markdown(
data: '111',
selectable: true,
),
);
},
showUserNames: true,
user: _user,
);
},
);
- 在 _sendMessage() 中也需要改变:
void _sendMessage(types.PartialText message) {
final textMessage = types.TextMessage(
author: _user,
createdAt: DateTime.now().millisecondsSinceEpoch,
id: const Uuid().v4(),
text: message.text,
);
_addMessage(textMessage);
sendToServer(message.text);
}
通过以上修改,可以有效地减少 setState() 的调用次数,从而避免闪屏问题,提升用户体验。
原文地址: https://www.cveoy.top/t/topic/n7Ob 著作权归作者所有。请勿转载和采集!