如何使用处置来防止内存泄漏

时间:2019-05-31 12:43:51

标签: flutter dart

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

@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对象的set对象上调用setState(),则会发生此错误。   不再显示在小部件树中的小部件(例如,其父级   小部件不再包含其小部件)。这个错误可以   当代码从计时器或动画调用setState()时发生   打回来。首选解决方案是取消计时器或停止   在dispose()回调中收听动画。另一种解决方案   是在调用之前检查此对象的“ mount”属性   setState()以确保对象仍在树中。

     

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

如何正确使用处置方式?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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