【问题标题】:How to use dispose to prevent memory leak如何使用 dispose 防止内存泄漏
【发布时间】:2019-10-17 02:51:53
【问题描述】:

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

@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();
        });
      }
    });
  }

我得到了这个错误:

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

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

我如何正确使用 dispose?

【问题讨论】:

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

标签: flutter dart


【解决方案1】:

我无法解释这是一个标准,但在我的代码中,我通常会在每个 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.
    }
    // ...
  });
}

【讨论】:

    【解决方案2】:

    在使用 Futures 时,我总是像下面这样重写我的 setState 方法,因此您无需在代码中的任何地方重写...

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

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2021-10-22
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多