在实时展示消息时,闪屏的问题可能与 setState() 的调用过于频繁有关。可以考虑使用 StreamBuilder 来实现实时展示消息,避免频繁调用 setState()。具体修改如下:

  1. 定义 StreamController:
StreamController<List<types.Message>> _streamController = StreamController();
  1. 将 setState() 修改为向 _streamController 添加数据:
void _addMessage(types.Message message) {
  final messages = List.from(Global.messages)..insert(0, message);
  _streamController.add(messages);
  Global.messages = messages;
}
  1. 在 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,
    );
  },
);
  1. 在 _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() 的调用次数,从而避免闪屏问题,提升用户体验。

Flutter Chat App: 使用 StreamBuilder 优化实时消息展示,避免闪屏

原文地址: https://www.cveoy.top/t/topic/n7Ob 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录