首页 > 解决方案 > 如何使 websocket 流广播到许多其他页面?

问题描述

我正在监听一个 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.

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

标签: websocketstreamdartflutter

解决方案


您可以使用广播。

 //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()”的流,则只能有一个侦听器


推荐阅读