flutter - 在 dispose() 之后调用 setState()

当我点击凸起的按钮时,时间选择器就会出现。现在,例如,如果我等待 5 秒,然后确认时间,则会出现此错误: setState() 在 dispose() 之后调用

我确实在控制台中看到了 flutter 是如何更新父小部件的,但为什么呢?我什么都不做——我只等5秒?! 下面的示例将在普通项目中工作,但是在我的项目中它更复杂,因为在我等待时 Flutter 正在更新状态......我做错了什么?有没有人猜到 Flutter 在我的更复杂的项目中而不是在简单的项目中随机更新的原因是什么?

[更新] 我再次查看它,发现它正在从我的 TabBarTabBarView 所在的级别更新。 它是否必须与 TabBarView 所需的“with TickerProviderStateMixin”有关?会不会是导致应用定期随机刷新?

 class DateTimeButton extends State<DateTimeButtonWidget> {
  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();
      }
    );
  }
}

最佳答案

在调用 setState() 之前,只需检查小部件状态类的 bool 属性 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);
    }
  }
}

https://stackoverflow.com/questions/49340116/

相关文章:

dart - Dart VM 还在使用吗?

flutter - 什么情况下 textAlign 属性在 Flutter 中有效?

android - 在 flutter 应用程序中添加日期选择器的正确方法是什么?

dart - 如何在 flutter 中制作全屏对话框?

dart - 如何去除滚动发光?

flutter - 如何将一列小部件紧紧包裹在卡片内?

android - Flutter 找不到 android sdk

flutter - BuildContext 在 Flutter 中做了什么?

dart - Flutter 切换到 Tab 重新加载小部件并运行 FutureBuilder

flutter - 如何在 Flutter 中创建圆形图标按钮?