首页 > 解决方案 > 在颤振中,如何让有状态的小部件/状态知道新数据可用并且需要重建?

问题描述

我正在 Flutter 中构建一个简单的聊天应用程序,其中一个聊天室可以有多个用户。有很多房间,用户可以同时加入多个房间,但用户屏幕上只会显示一个聊天屏幕(也就是用户的活动聊天室)。

当用户在聊天室中发布新消息时,服务器会向聊天室中的其他用户(应用程序/设备)发送新消息可用的通知。

此时,我的应用程序知道服务器中有新消息,它甚至可以从服务器获取数据。但是,我不确定如何将新数据传递到聊天屏幕的StatefulWidget& State

下面的问号是我遇到问题的缺失步骤

  1. 服务器向应用程序发送事件通知以获取新消息。
  2. 应用程序接收事件通知,消息处理程序处理并从服务器检索新的聊天消息。它现在需要将新的聊天消息数据传递给聊天屏幕小部件。
  3. ???(魔术在这里发生,数据现在传递到聊天屏幕小部件/状态)
  4. 聊天屏幕小部件/状态现在有新的消息数据和刷新 UI。

我想到的一些解决方案是......

  1. 创建一个扩展ChangeNotifier的模型,并让模型跟踪所有需要在 UI 上显示的聊天消息。聊天屏幕小部件将使用Provider/Consumer依赖于该模型。当获取新的聊天消息时,它将附加到模型中的聊天消息中。订阅者(聊天屏幕状态)将通过 通知notifyListeners()。聊天屏幕 UI 将收到通知并将使用模型中可用的聊天消息的最新快照重新构建。

  2. 该状态包含所有需要显示的聊天消息。另外,创建一个流。当获取新的聊天消息时,将它们推送到流中。让状态订阅流,每当有新数据传入时,使用 将它们附加到状态的消息列表中setState,UI 将被重建。

但是,我只是不觉得上述两种方法是让State知道有新聊天消息数据可用的最优雅的方法。在我不必处理 UI 状态管理的常规编程中,我会在聊天屏幕小部件/状态中创建一个公共方法,并使用聊天消息作为参数调用它,但这不是 Flutter 中的操作方式。

我是 Flutter 的新手,我不熟悉好的做法。解决此问题的标准/最佳方法是什么?在我的用例中,是否有更简单、更好的方法将数据传递给聊天屏幕小部件?

标签: flutter

解决方案


您可以将聊天窗口包装在 StreamBuilder( https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html ) 中。

它基本上会在每次更改(例如新消息)时重建其中的整个 UI,但这就是 Flutter 的工作方式。


推荐阅读