如何使用dispose防止内存泄漏

Mic*_*ael 15 dart flutter

我有这个初始化状态方法:

@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();
        });
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

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

如果调用 setState() ,则此错误可能表示内存泄漏,因为另一个对象在从树中删除后仍保留对此 State 对象的引用。为避免内存泄漏,请考虑在 dispose() 期间中断对此对象的引用。

我如何以正确的方式使用处置?

Geo*_*rge 15

我无法解释这是一个标准,但在我的代码中,我通常会mounted在每个Future事件中进行检查;无论是.then.catchError.whenComplete回调。

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

  getNumber(index).then((number) {
    if (!mounted) {
      return; // Just do nothing if the widget is disposed.
    }
    // ...
  });
}
Run Code Online (Sandbox Code Playgroud)


Hyu*_*gur 5

使用 Futures 时,我总是重写我的 setState 方法,如下所示,因此您不需要重写代码中的所有位置......

void setState(fn) {
    if (mounted) super.setState(fn);
}
Run Code Online (Sandbox Code Playgroud)