flutter - 在颤振中,如何让有状态的小部件/状态知道新数据可用并且需要重建?
问题描述
我正在 Flutter 中构建一个简单的聊天应用程序,其中一个聊天室可以有多个用户。有很多房间,用户可以同时加入多个房间,但用户屏幕上只会显示一个聊天屏幕(也就是用户的活动聊天室)。
当用户在聊天室中发布新消息时,服务器会向聊天室中的其他用户(应用程序/设备)发送新消息可用的通知。
此时,我的应用程序知道服务器中有新消息,它甚至可以从服务器获取数据。但是,我不确定如何将新数据传递到聊天屏幕的StatefulWidget
& State
。
下面的问号是我遇到问题的缺失步骤
- 服务器向应用程序发送事件通知以获取新消息。
- 应用程序接收事件通知,消息处理程序处理并从服务器检索新的聊天消息。它现在需要将新的聊天消息数据传递给聊天屏幕小部件。
- ???(魔术在这里发生,数据现在传递到聊天屏幕小部件/状态)
- 聊天屏幕小部件/状态现在有新的消息数据和刷新 UI。
我想到的一些解决方案是......
创建一个扩展ChangeNotifier的模型,并让模型跟踪所有需要在 UI 上显示的聊天消息。聊天屏幕小部件将使用
Provider
/Consumer
依赖于该模型。当获取新的聊天消息时,它将附加到模型中的聊天消息中。订阅者(聊天屏幕状态)将通过 通知notifyListeners()
。聊天屏幕 UI 将收到通知并将使用模型中可用的聊天消息的最新快照重新构建。该状态包含所有需要显示的聊天消息。另外,创建一个流。当获取新的聊天消息时,将它们推送到流中。让状态订阅流,每当有新数据传入时,使用 将它们附加到状态的消息列表中
setState
,UI 将被重建。
但是,我只是不觉得上述两种方法是让State
知道有新聊天消息数据可用的最优雅的方法。在我不必处理 UI 状态管理的常规编程中,我会在聊天屏幕小部件/状态中创建一个公共方法,并使用聊天消息作为参数调用它,但这不是 Flutter 中的操作方式。
我是 Flutter 的新手,我不熟悉好的做法。解决此问题的标准/最佳方法是什么?在我的用例中,是否有更简单、更好的方法将数据传递给聊天屏幕小部件?
解决方案
您可以将聊天窗口包装在 StreamBuilder
( https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html ) 中。
它基本上会在每次更改(例如新消息)时重建其中的整个 UI,但这就是 Flutter 的工作方式。
推荐阅读
- c++ - pmr::vector 比 std::vector 慢
- java - JDK 1.5 中的代码构建,但运行时使用 1.8,是否存在性能问题?
- docker - 如何在容器内从一个域“重定向”到另一个域?
- python - Pandas 的 Airflow 并行任务
- javascript - Firebase Firestore endBefore() 处理数据末尾
- bash - 如何使用 sed 或任何其他方法仅替换 magento envfile 中的 dbpassword
- architecture - 构建应用程序的授权在哪里是必要的?
- python - Django - 模型在字符串 'MM/DD/YYYY' 中有日期,在这种情况下我如何 order_by(date)?
- rust - 生成图像的快速 2D 绘图
- javascript - 在按钮单击事件上模拟击键的问题