2

我有Model执行代码。我Model提供Provider. 但是如果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();
  }
);

    …

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

4

1 回答 1

9

我只是有同样的问题。

发生错误是因为您使用其中一种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();
  }
}
于 2020-01-21T10:33:32.943 回答