如何在Flutter应用程序的多个屏幕中使用来自一个连接的WebSocket数据?

y4ekin9u  于 2023-02-25  发布在  Flutter
关注(0)|答案(1)|浏览(145)

我正在构建一个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数据。

66bbxpm5

66bbxpm51#

根据您选择的状态管理库,可以使用一些方法来处理此场景。
以下是一种方法的一些基本思想。
我个人推荐rxdart,因为它的Stream-subclass BehaviorSubject允许您访问Stream的最后一个输出值,而无需订阅,基类Stream不提供这个很酷的特性。
假设我们有一个名为MessageSerivcesingleton服务,我们将从webSocketChannel流发出的值添加到_subject流:

class MessageSerivce {
  final _subject = BehaviorSubject<Message>();

  Stream<Message> get stream => _subject;
  Message get latest =>  _subject.value;

  void startListen() {
    // setup web socket
    webSocketChannel.stream.listen((data) {
      _subject.add(Message.parse(data));
    });
  }

  void stopListen() {}
}

您可以使用StreamBuilder小部件来侦听messageService.stream,以便在发出新消息时在任何位置重建UI。
使用messageService.latest从任何地方访问最新消息。

相关问题