首页 > 解决方案 > 颤振捕捉变化

问题描述

有没有办法让一个小部件(例如文本)值链接到一个 for 循环内的变量,并在每次循环内的变量发生变化时改变它,我想让小部件文本也改变,因为例子:

int count;
for(var i = 0; i <= 100; i++){
count = i;
}

小部件代码:

Text('Loop: ' + count.toString());

我正在寻找类似的输出 Text('Loop: 1'),每次循环继续输出时,Text('Loop (1,2,3,4,5....)') 但问题在于这段代码,文本小部件等到循环结束并给我最后一个计数。有没有办法在不等待循环结束的情况下更改文本小部件?谢谢。

标签: flutterdart

解决方案


如果您的循环在同一个线程上运行,则在函数结束之前不会发生像 setState 这样的调用。您需要做的是在另一个线程上启动循环。这个例子应该可以帮助你理解我的意思(它使用线程包 [https://pub.dev/packages/threading])

class _MyHomePageState extends State<MyHomePage> {
  int counter = 0;
  @override
  void initState() {
    var thread = new Thread(count);
    thread.start();
    super.initState();
  }

  void count() async {
    for (int i = 0; i < 100; i++) {
      setState(() {
        counter = i;
      });
      await Thread.sleep(1000);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text("$counter"),
      ),
    );
  }
}

但是,这将是了解 Streams、StreamControllers 和我们现有的许多状态管理库的好时机,因为您通常会通过这些来处理类似的事情。

注意:如果您启用了 null 安全,则 threading 包不是 null 安全的,因此您必须添加--no-sound-null-safetyflutter run命令中才能使其工作。


推荐阅读