Flutter:“Stream 已被收听。”

Cod*_*on 1 dart flutter stream-builder

我有一个DefaultTabController有两个选项卡的工作正常。在我的第二个选项卡上,我最近添加了一个stream controller用于在每次值发生变化时更新屏幕上的值,这也可以正常工作,但如果我要快速向左移动到第一个选项卡,然后返回到第二个选项卡,则会出现以下错误。

Stream has already been listened to.

我有一个处置功能,但由于没有导航到另一个页面,它不会触发,因此它创建了许多流,我不希望它这样做。

下面的所有代码都是针对流控制器的,如果我注释掉所有这些代码,应用程序可以正常工作,不会出现错误,而且我还发现,如果我只注释掉,stream: stream_controller.stream,我也不会收到错误。

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

Ale*_*ntt 8

Stream<T>s 只能听一次。要启用任意数量的侦听器,请使用:

StreamController<int> stream_controller = StreamController<int>.broadcast();
Run Code Online (Sandbox Code Playgroud)

此外,在您的上下文中,您似乎正在重用同一个StreamController实例。initState尝试在内部而不是作为类字段定义它:

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();
  } 
}
Run Code Online (Sandbox Code Playgroud)

广播流允许任意数量的侦听器,并且当事件准备好时,无论是否有侦听器,它都会触发其事件。

有关详细信息,请参阅完整Stream文档