How to make websocket stream broadcast to many other pages?

4,332

Solution 1

You can use broadcasts.

 //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");

}

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

When using broadcasts you can have multiple listeners in the same stream.

If you simply use a stream without ".broadcast ()" you can only have one listener

Solution 2

Solution for package web_socket_channel:

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

After that simply use streamController.stream to listen web socket events.

Share:
4,332
Nicholas Jela
Author by

Nicholas Jela

I am an engineer in China, I have asked many question...

Updated on December 05, 2022

Comments

  • Nicholas Jela
    Nicholas Jela over 1 year

    I have a websocket stream being listened:

    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();
    });
    

    But, when enter that page again, there was an error says: Bad state: Stream has already been listened to.

    How to make it as broadcast and other pages can receive that broadcast?