希望有人(S)可以帮助向我解释为什么会发生这种情况,因为这对我来说没有意义,并且已经花了几天时间来弄清楚是什么导致了这个问题。
基本情况是,当我全局定义StreamController时,它工作正常,但一旦我尝试在函数中定义它,StreamBuilder就永远不会收到新数据/消息的通知:
class _MyHomePageState extends State<MyHomePage> {
static StreamController<bool?>? streamController = StreamController(); // Works
// static StreamController<bool?>? streamController; // Doesn't work
static void start() async {
// streamController = StreamController(); // Doesn't work
streamController!.sink.add(true);
}
@override
Widget build(BuildContext context) {
...
StreamBuilder<bool?>(
stream: streamController?.stream,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.active:
_counter++;
continue keepGoing;
keepGoing:
case ConnectionState.done:
case ConnectionState.waiting:
return Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
);
case ConnectionState.none:
return const CircularProgressIndicator();
return const Placeholder();
default:
return const Text("Unknown State of Stream.");
}
}),
FloatingActionButton(
onPressed: () => start(),
tooltip: 'Increment',
child: const Icon(Icons.play_arrow_outlined),
),
...
}
}
我目前的猜测是StreamBuilder中对StreamController的引用永远不会得到更新的引用,但我对此表示怀疑,因为我相信Widget的状态应该随着按钮的按下而更新。任何其他的建议和解释将是伟大的。
先谢谢你了。
1条答案
按热度按时间qlfbtfca1#
正如你已经意识到的,参考没有更新。按钮按下不会触发重建(这也没有意义,因为按钮不知道您是否导致状态更改)。您将
streamController?.stream
分配给StreamBuilder
,它只在开始时进行重建,然后再将值分配给streamController。如果您希望UI在State
更改时自动更新,则应使用setState
:是否预期
streamController
是静态的,并且每次按下按钮时重新分配,而不首先关闭?即使您在这里使用setState
,也没有值会到达StreamBuilder
,因为您在执行实际重建之前调用了streamController.add(true)
,StreamBuilder已经收到了新的流引用。或者你只是在尝试溪流?