【问题标题】:Why does StreamBuilder uses initialData multiple times and not it's latest snapshot?为什么 StreamBuilder 多次使用 initialData 而不是最新的快照?
【发布时间】:2020-07-11 13:37:01
【问题描述】:

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

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

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

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

Bad state: Stream 已经被监听

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

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

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

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

【问题讨论】:

  • 将 StreamBuilder 包装在 Builder 中解决了第二个问题,不知道为什么......

标签: flutter dart stream-builder dart-stream


【解决方案1】:

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

此外,在StreamBuilder 打印snapshot.connectionState 中,您的connectionState 可能会更改为waitingactive,因此使用initalData 调用构建器。

这就是你发布的少量代码我能猜到的,测试一下,让我知道它是怎么回事。

【讨论】:

  • printing connectionState 确认流正在执行waiting -> active 用于第一次渲染,仅waiting 用于进一步渲染
  • 所以如果这回答了你的问题,别忘了接受它并投票给它
猜你喜欢
  • 2021-03-16
  • 2020-12-21
  • 2021-08-08
  • 2012-08-31
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
相关资源
最近更新 更多