小部件停用后如何在ChangeNotifier中捕获错误?

时间:2019-10-27 09:31:44

标签: flutter dart flutter-provider

我在Model中有要执行的代码。我为Model提供了Provider。但是,如果Model在完成执行之前被处置,则会出现错误:

  

E / flutter(26180):[错误:flutter / lib / ui / ui_dart_state.cc(148)]   未处理的异常:处理后使用了模型。电子/颤振   (26180):在模型上调用dispose()后,它就无法再使用   被使用。

例如,如果用户按下后退按钮,Model就会被处置。这是因为Navigator.pop()仅是此小部件的作用域。

但这意味着我无法在Model中捕获错误吗?

我的代码:

Model

处置后如何在模型中捕获错误?

1 个答案:

答案 0 :(得分:7)

我只是遇到了同样的问题。

发生错误是因为您在ChangeNotifier之后使用了notifyListeners()方法之一,通常是dispose()(我假设您正在调用,但是没有粘贴代码)已被调用。顺便说一下,这是一个断言错误,因此仅在调试版本中。

要摆脱该错误,您可以在使用自己的标志调用notifyListeners()之前检查对象是否已被处置:

class Model extends ChangeNotifier {
  bool error = false;
  bool isDisposed = false;

  func() {
    try {
      await execute();
      error = false
    } catch {
      error = true;
      print(e.toString());
    }

    if (!isDisposed) {
      notifyListeners();
    }
  }

  @override
  void dispose() {
    isDisposed = true;
    super.dispose();
  }
}