Flutter 如何使用dispose防止内存泄漏

Flutter 如何使用dispose防止内存泄漏,flutter,dart,Flutter,Dart,我有一个init state方法: @override void initState() { super.initState(); getNumber(index).then((number) { if (number> 1000) { number = number/ 1000; setState(() { flag = true; _num = number.toInt().toS

我有一个init state方法:

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

    getNumber(index).then((number) {
      if (number> 1000) {
        number = number/ 1000;
        setState(() {
          flag = true;
          _num = number.toInt().toString();
        });
      } else {
        setState(() {
          _num = number.toInt().toString();
        });
      }
    });
  }
我得到了这个错误:

如果对状态对象调用setState()以获取 不再出现在小部件树中的小部件(例如,其父级 小部件不再在其构建中包含小部件)。此错误可能会导致 当代码从计时器或动画调用setState()时发生 回拨。首选的解决方案是取消计时器或停止 在dispose()回调中侦听动画。另一个解决方案 是在调用之前检查此对象的“mounted”属性 setState()以确保对象仍在树中

如果调用setState(),此错误可能表示内存泄漏 因为另一个对象正在保留对此状态对象的引用 从树上移除后。为了避免内存泄漏, 考虑在Debug().< /P>期间中断对该对象的引用。
如何以正确的方式使用dispose?

我无法解释这是一个标准,但在我的代码中,我通常在每个
未来的
事件中检查
是否装载了
;无论是
.then
.catchError
,还是
。完成时
回调

@覆盖
void initState(){
super.initState();
getNumber(索引)。然后((编号){
如果(!已安装){
return;//如果小部件被释放,则不执行任何操作。
}
// ...
});
}

在使用Futures时,我总是像下面那样重写我的setState方法,所以您不需要重写代码中的任何地方

void setState(fn) {
    if (mounted) super.setState(fn);
}

你可以在setState之前使用if(monunted)来避免当你的小部件不在小部件树if(monunted){setState((){});}中时调用setState,所以实际上我应该在我的应用程序中的每个setState之前使用它?不,只有在异步函数中,如果你正在导航哪些更改了小部件树