为什么 StreamBuilder 多次使用 initialData 而不是最新的快照?

Why does StreamBuilder uses initialData multiple times and not it's latest snapshot?

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

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

我在使用 TabBarView 渲染 StreamBuilder 时遇到一些奇怪的行为。

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

Bad state: Stream has already been listened to

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

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

I/flutter (14541): dope
I/flutter (14541): properURL
I/flutter (14541): dope
I/flutter (14541): dope

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

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

此外,在 StreamBuilder 打印 snapshot.connectionState 中,您的 connectionState 可能会更改为 waitingactive,因此正在调用生成器initalData.

这是我对您发布的少量代码的猜测,测试一下,让我知道结果如何。