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

Flu*_*ase 2 dart flutter flutter-provider

我有Model要执行的代码。我公司提供ModelProvider。但是如果Model在完成执行之前处理我得到错误:

E/flutter (26180): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:模型被处理后使用。E/flutter (26180):一旦你在模型上调用了 dispose(),它就不能再使用了。

例如Model,如果用户按后退按钮则处理Navigator.pop()。这是因为Model仅适用于此 Widget。

但这意味着我无法在Model?

我的代码:

class Model extends ChangeNotifier {

  bool error = false;

  func() {

    try {

    await execute();
    error = false

    } catch {
    error = true;
    print(e.toString());
    }

  }

}



class ExampleWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

return ChangeNotifierProvider(
      builder: (context) => Model(),
child: Consumer<Model>(builder: (context, model, _) {
return FloatingActionButton(
  child: model.error ? Icon(Icons.error) : Icon(Icons.check),
  onPressed: () {
    model.func();
  }
);

    …
Run Code Online (Sandbox Code Playgroud)

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

wam*_*ous 8

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

发生错误是因为您使用其中一种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();
  }
}
Run Code Online (Sandbox Code Playgroud)