一尘不染

在dispose()之后调用setState()

flutter

当我单击凸起的按钮时,将显示时间选择器。现在,如果我等待约5秒钟,然后确认时间,则会发生此错误,则 在dispose()之后调用setState()

我实际上在控制台中看到了如何更新父窗口小部件,但是为什么呢?-我什么也没做-
我只等5秒钟!此示例在正常项目中将可用,但是在我的项目中则更为复杂,因为在我等待的过程中flutter正在更新状态,所以它将不起作用…我怎么办?有谁能猜测,在我较复杂的项目中而不是在简单的项目中,抖动会随机更新是什么?

[更新] 我检查了它是否从我的TabBar和TabBarView所在的级别进行更新。它可能需要对Tabbarview进行“ with 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();
      }
    );
  }
}

阅读 468

收藏
2020-08-13

共1个答案

一尘不染

只需mounted在调用之前检查窗口小部件的状态类的boolean属性setState()

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

或更干净的setState方法在您的StatelfulWidget类中重写方法。

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