flutter 为什么StreamController在函数内部初始化时不能正常工作

dkqlctbz  于 2023-05-30  发布在  Flutter
关注(0)|答案(1)|浏览(151)

希望有人(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的状态应该随着按钮的按下而更新。任何其他的建议和解释将是伟大的。
先谢谢你了。

qlfbtfca

qlfbtfca1#

正如你已经意识到的,参考没有更新。按钮按下不会触发重建(这也没有意义,因为按钮不知道您是否导致状态更改)。您将streamController?.stream分配给StreamBuilder,它只在开始时进行重建,然后再将值分配给streamController。如果您希望UI在State更改时自动更新,则应使用setState

setState(() => streamController = StreamController())

是否预期streamController是静态的,并且每次按下按钮时重新分配,而不首先关闭?即使您在这里使用setState,也没有值会到达StreamBuilder,因为您在执行实际重建之前调用了streamController.add(true),StreamBuilder已经收到了新的流引用。
或者你只是在尝试溪流?

相关问题