如何让 websocket 流广播到许多其他页面?

Nic*_*ela 6 stream websocket dart flutter

我有一个正在监听的 websocket 流:

widget.channel.stream.listen((data) {
  print("!!!!new msg: $data");
  var dataJson = json.decode(data);
  print(dataJson["content"]);
  // do my job
  setState(() {
    _allAnimateMessages.insert(0, newMsg);
  });
  newMsg.animationController.forward();
});
Run Code Online (Sandbox Code Playgroud)

但是,当再次进入该页面时,出现错误提示: Bad state: Stream has already been listened to.

如何使它成为广播而其他页面可以接收该广播?

Mol*_*0ko 8

web_socket_channel的解决方案:

final channel = IOWebSocketChannel.connect(socketUrl);
final streamController = StreamController.broadcast();
streamController.addStream(channel.stream);
Run Code Online (Sandbox Code Playgroud)

之后只需使用streamController.stream监听网络套接字事件即可。


Nic*_*ela 0

由于没有有用的答案,我在这里更新我的答案以供其他参考。

  1. 重复订阅流是 flutter 中所需的行为。

如果您只使用 StreamBuilder,则流只能监听一次。想想看,如果您的流可以监听许多其他页面或小部件,那么数据就会重复。

  1. 但是如果您想使用一个流并更新所有小部件

当开发一个复杂的应用程序时,确实可能会发生这种情况,例如,您正在构建一个聊天应用程序,新消息来了,您应该更新许多页面UI(您的对话框聊天UI,您的会话列表UI....),然后您应该在很多页面订阅这个流,我仍然没有找到正确的方法来做到这一点,除了让这个流被广播,并做你的工作。