setState() 在 dispose() 后调用。

11 浏览
0 Comments

setState() 在 dispose() 后调用。

当我点击提升按钮时,时间选择器会显示出来。现在,如果我等待5秒钟,然后确认时间,就会出现这个错误:

setState() called after dispose()

我亲眼看到flutter在控制台中更新父部件,但为什么?我什么也没做 - 我只是等待了5秒钟。!

下面的示例将在普通项目中工作,但在我相当复杂的项目中将无法工作,因为Flutter正在更新状态,而我正在等待......我做错了什么?有没有人猜测Flutter在我的更复杂的项目中随机更新而不是在简单项目中?

[更新]

我第二次看了一眼,发现它是从我的TabBarTabBarView所在的层面更新的。

这可能与“使用TickerProviderStateMixin”有关,我需要为TabBarView吗?它可能导致应用程序定期和随机刷新吗?

 class DateTimeButton extends State {
  DateTime selectedDate = new DateTime.now();
  Future initTimePicker() async {
    final TimeOfDay picked = await showTimePicker(
      context: context,
      initialTime: new TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute),
    );
    if (picked != null) {
      setState(() {
        selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
      });
    }
  }
  @override
  Widget build(BuildContext context) {
    return new RaisedButton(
      child: new Text("${selectedDate.hour} ${selectedDate.minute}"),
      onPressed: () {
        initTimePicker();
      }
    );
  }
}

admin 更改状态以发布 2023年5月21日
0
0 Comments

如果预期的行为是,在部件已被销毁时,`Future` 完成,您可以使用

if (mounted) {
  setState(() {
    selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
  });
}

0
0 Comments

在调用setState()之前,先检查你的小部件的状态类的布尔属性mounted

if (this.mounted) {
  setState(() {
    // Your state change code goes here
  });
}

或者更加简洁的方法,重写你的StatelfulWidget类中的setState方法。

class DateTimeButton extends StatefulWidget {
  @override
  void setState(fn) {
    if(mounted) {
      super.setState(fn);
    }
  }
}

0