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

时间:2018-05-23 07:41:00

标签: websocket stream 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();
});

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

如何将其作为广播,其他页面可以接收该广播?

3 个答案:

答案 0 :(得分:0)

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

  1. 重复订阅流是扑朔迷离的理想行为。

如果您仅使用StreamBuilder,则流只能侦听一次。考虑一下,如果您的流可以收听许多其他页面或小部件,那么数据将被重复。

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

这确实是在开发复杂的应用程序时可能发生的,例如,您正在构建聊天应用程序,出现新消息,您应该更新许多页面的UI(您的对话框聊天ui,您的会话列表ui ....) ,那么您应该在许多页面上订阅此视频流,我仍然没有找到合适的方法来这样做,除了使该视频流得以广播并完成您的工作。

答案 1 :(得分:0)

您可以使用广播。

 //Here is the solution
 StreamController<String> streamController = new StreamController.broadcast();   //Add .broadcast here

//Now you can listen from various places
@override
void initState() {
  super.initState();

  print("Creating a StreamController...");
  //First subscription
  streamController.stream.listen((data) {
    print("DataReceived1: " + data);
  }, onDone: () {
    print("Task Done1");
  }, onError: (error) {
    print("Some Error1");
  });
  //Second subscription
  streamController.stream.listen((data) {
    print("DataReceived2: " + data);
  }, onDone: () {
    print("Task Done2");
  }, onError: (error) {
    print("Some Error2");
  });

  streamController.add("This a test data");
  print("code controller is here");

}

字体:https://medium.com/@ayushpguptaapg/using-streams-in-flutter-62fed41662e4

使用广播时,您可以在同一流中拥有多个侦听器。

如果仅使用不带“ .broadcast()”的流,则只能有一个侦听器

答案 2 :(得分:0)

软件包web_socket_channel的解决方案:

final channel = IOWebSocketChannel.connect(socketUrl);
final streamController = StreamController.broadcast();
streamController.addStream(channel.stream);

之后,只需使用streamController.stream来监听Web套接字事件。