为什么 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
可能会更改为 waiting
到 active
,因此正在调用生成器initalData
.
这是我对您发布的少量代码的猜测,测试一下,让我知道结果如何。
我可能只是误解了飞镖的流,但是当我这样做时:
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
可能会更改为 waiting
到 active
,因此正在调用生成器initalData
.
这是我对您发布的少量代码的猜测,测试一下,让我知道结果如何。