0

我可能只是误解了飞镖的流,但是当我这样做时:

TabBarView(
  children: [
    ...
    StreamBuilder(
      builder(context, url){ 
        ...
        print(url);
        ...
      },
      stream: () async* { ... }().asBroadcastStream(),
      initialData: 'Dope',
    )
    ...
  ]
)

使用 TabBarView 渲染 StreamBuilder 时出现一些奇怪的行为。

首先,我必须使用asBroadcastStream()否则我会得到:

错误状态:Stream 已被收听

我承认这是一个糟糕的解决方案。

但是,虽然解决方案有效,但现在返回 TabBarView 中的 StreamBuilder 将重新使用 initialData 而不是流的最新快照来重建。这是两次返回选项卡时的打印输出:

I/flutter (14541):涂料
I/flutter (14541):正确的 URL
I/flutter (14541):涂料
I/flutter (14541):涂料

我认为这两个问题都是相关的,但我不明白为什么 StreamBuilder 重用 async* 和 initialData

4

1 回答 1

0

可能正在重新创建您的小部件,将其转换为 aStatefulWidget并在其中覆盖dispose()print(disposed)进行确认。

此外,在StreamBuilderprint 中snapshot.connectionState,您connectionState可能正在更改为waitingto active,因此正在使用 调用构建器initalData

对于您发布的少量代码,这就是我可以猜到的,测试一下,让我知道它是如何进行的。

于 2020-03-31T04:45:00.793 回答