我正在构建一个Flutter应用程序,它通过WebSocket连接从服务器接收实时数据。从服务器接收的数据与应用程序的所有屏幕相关。我希望在应用程序的所有屏幕中使用这些数据,而不必在每个屏幕上建立新的Websocket连接。
如何实现这一点?是否有一种方法可以只建立一次WebSocket连接,并在应用程序的所有屏幕中使用接收到的数据?是否应该使用全局变量来存储接收到的数据,或者有更好的方法?
我正在使用web_socket_channel包建立WebSocket连接,并且正在使用Navigator小部件将接收到的数据传递到每个屏幕,但是这种方法不可扩展,并且使代码难以维护。
我们将非常感谢有关如何实现此功能的任何指导。
下面是我的初始化套接字连接函数。
import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
late WebSocketChannel webSocketChannel;
void connectWebSocket() {
WebSocket.connect("wss://MY_DOMAIN_URL", headers: {
'Connection': 'Upgrade',
'Upgrade': 'WebSocket',
}).then((ws) {
log('SOCKET CONNECCTED');
// create the stream channel
webSocketChannel = IOWebSocketChannel(ws);
// webSocketChannel.stream.listen((message) {
// log(message);
// });
}).catchError((onError) {
log('onError $onError');
});
}
如有必要,我想在所有屏幕上使用message
数据。
此外,我检查了StramBuilder
,但在某些情况下,我还希望访问构建方法之外的message
数据。
1条答案
按热度按时间66bbxpm51#
根据您选择的状态管理库,可以使用一些方法来处理此场景。
以下是一种方法的一些基本思想。
我个人推荐
rxdart
,因为它的Stream-subclassBehaviorSubject
允许您访问Stream的最后一个输出值,而无需订阅,基类Stream
不提供这个很酷的特性。假设我们有一个名为
MessageSerivce
的singleton服务,我们将从webSocketChannel
流发出的值添加到_subject
流:您可以使用
StreamBuilder
小部件来侦听messageService.stream
,以便在发出新消息时在任何位置重建UI。使用
messageService.latest
从任何地方访问最新消息。