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

hs1ihplo  于 2022-12-14  发布在  Flutter
关注(0)|答案(3)|浏览(171)

我有这个init状态方法:

@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,则会发生此错误()在不再出现在小部件树中的小部件的State对象上(例如,其父小部件在其构建中不再包含该小部件)。当代码调用setState时,可能会发生此错误()。首选解决方案是取消计时器或停止侦听释放另一个解决方案是在调用setState()之前检查该对象的“mounted”属性,以确保该对象仍在树中。
如果调用setState()是因为另一个对象在从树中删除此State对象后仍保留对此对象的引用,则此错误可能指示内存泄漏。若要避免内存泄漏,请考虑在dispose()期间中断对此对象的引用。
我如何正确使用dispose?

eqqqjvef

eqqqjvef1#

我不能说明这是一个标准,但是在我的代码中,我通常在每个Future事件中检查mounted;无论是.then.catchError还是.whenComplete回调。

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

  getNumber(index).then((number) {
    if (!mounted) {
      return; // Just do nothing if the widget is disposed.
    }
    // ...
  });
}
siotufzp

siotufzp2#

当使用Futures时,我总是覆盖我的setState方法,如下所示,所以你不需要重写代码中的任何地方...

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

mjqavswn3#

说明:

如果您对不再出现在小部件树中的小部件(例如,其父小部件在其构建中不再包含该小部件)的State对象调用setState(),则会发生此错误。当代码从计时器或动画回调调用setState()时,会发生此错误。

解决方案

1.取消计时器或停止侦听dispose()回调中的动画。
1.在调用setState()之前,检查小部件的state类的mounted属性,如下所示:

if (!mounted) return;

setState(){
    /* ... */
}

if (mounted) {
  setState(() {
    /* ... */
  });
}

相关问题