Android 异步周期设置状态

Android 异步周期设置状态,android,dart,flutter,Android,Dart,Flutter,我正在尝试实现一个函数,它会定期将小部件添加到我的列表中,例如每2秒添加一次,然后调用setState来更新我正在绘制的列表 我试着只调用setState,它只运行了一次,我认为setState只是不调用函数。我试图在函数中使用ever Whiletrue,但在设置state之后,它就中断了。我还尝试了递归,它也在一次调用后停止 class _HomePageState extends State<HomePage>{ List<Widget> currentMes

我正在尝试实现一个函数,它会定期将小部件添加到我的列表中,例如每2秒添加一次,然后调用setState来更新我正在绘制的列表

我试着只调用setState,它只运行了一次,我认为setState只是不调用函数。我试图在函数中使用ever Whiletrue,但在设置state之后,它就中断了。我还尝试了递归,它也在一次调用后停止

class _HomePageState extends State<HomePage>{

  List<Widget> currentMessages = [];

  Future<void> addText() async {
      await Future.delayed(Duration(seconds: 2));
      setState((){
        currentMessages.add(Text("It works?"));
      });
  }

  @override
  Widget build(BuildContext context) {

    addText();

    return Scaffold(
      body: Center(
        child: ListView(
          children: (currentMessages.isEmpty ? <Widget>[Container()]:currentMessages),
        ),
      )
    );
  }
}
这应该行得通

class _SOState extends State<SO> {
  List<Widget> currentMessages = [];

  Timer timer;

  @override
  void initState() {
    super.initState();

    const twoSec = const Duration(seconds: 2);
    timer = new Timer.periodic(twoSec, (Timer t) {
      setState(() {
        currentMessages.add(Text("It works?"));
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ListView.builder(
          itemCount: currentMessages.length,
          itemBuilder: (BuildContext context, int index) {
            if (currentMessages.length == 0) return Container();
            return currentMessages[index];
          },
        ),
      ),
    );
  }

  @override
  void dispose() {
    timer.cancel();
    super.dispose();
  }
}
不知道为什么ListView不更新代码的更改。因此,我使用了一个生成器。

分别覆盖initState和dispose,创建和取消计时器。例如:

class MyAppState extends State<MyApp> {
  Timer t;

  @override
  void initState() {
    super.initState();
    t = Timer.periodic(
      Duration(seconds: 1),
      (_) {
        setState(() {
          // do something here that will happen every second
        });
      },
    );
  }

  @override
  void dispose() {
    t?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

使用Timer.periodic调用addText。不要从构建开始做。记住覆盖dispose,这样你就可以取消计时器。我必须在哪里实现它?在建?或者在另一个异步函数中?您可能希望阅读“是”,它应该可以工作,但在描述文档的ListView中存在问题,因此我也使用了itemBuilder。如果您不需要生成器,请阅读