Home > Software design >  Flutter: 'Stream has already been listened to.'
Flutter: 'Stream has already been listened to.'

Time:08-07

I have a DefaultTabController with two tabs which work fine. On my second tab I have recently added a stream controller to update a value on screen everytime that value changes which also works fine, but if I was to swift left to the first tab then back to the second I get the following error.

Stream has already been listened to.

I have a dispose function but due to not navigating to another page it does not trigger so it create many stream, which I don't want it to do.

All the code below is for the stream controller, if I comment all this code out, the app works fine without the error and ive also found out if I comment out only stream: stream_controller.stream, I also dont get the error.

StreamController<int> stream_controller = StreamController<int>();
@override
  void dispose(){
    super.dispose();
    stream_controller.close();
   
  } 
StreamBuilder(
                                          initialData: 0,
                                          stream: stream_controller.stream,
                                          builder: (context, snapshot) {
                                            return Padding(
                                              padding: const EdgeInsets.all(8.0),
                                              child: Text(
                                                '#${snapshot.data}',
                                              ),
                                            );
                                          })
 stream_controller.sink.add(rank);

CodePudding user response:

Stream<T>s can only be listened once. To enable any number of listeners, use:

StreamController<int> stream_controller = StreamController<int>.broadcast();

Also in your context seems you're reusing the same StreamController instance. Try defining it inside initState rather of as class field:

class _MyState extends State<T> {
  late StreamController<int> stream_controller;

  @override
  void initState() {
    super.initState();
    stream_controller = StreamController<int>.broadcast();
  }

  @override
  void dispose(){
    stream_controller.close();
    super.dispose();
  } 
}

A broadcast stream allows any number of listeners, and it fires its events when they are ready, whether there are listeners or not.

See complete Stream documentation for details.

  • Related