Как отловить ошибку в ChangeNotifier после деактивации виджета?

У меня есть код Model для исполнения. Я предоставляю Model Provider. Но если Model удаляется до завершения выполнения, я получаю сообщение об ошибке:

E / flutter (26180): [ОШИБКА: flutter / lib / ui / ui_dart_state.cc (148)] Необработанное исключение: Модель использовалась после удаления. E / flutter (26180): после того, как вы вызвали dispose () для модели, ее больше нельзя использовать.

Например, Model удаляется, если пользователь нажимает кнопку возврата, поэтому Navigator.pop(). Это потому, что Model является только областью действия этого виджета.

Но это значит, что я не могу поймать ошибку в 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();
  }
);

    …

Как я могу отловить ошибку в модели после удаления?


person FlutterFirebase    schedule 27.10.2019    source источник
comment
Вы уже вчера разместили этот вопрос и удалили его вместе с моим ответом. Как вам удалось его удалить, хотя я дал ответ?   -  person creativecreatorormaybenot    schedule 27.10.2019
comment
@creativecreatorormaybenot Раньше я задавал плохой вопрос. Это более конкретно. Вы ответили неправильно. Даже если проверить mounted? с помощью Stateful Widget, все равно будет выдаваться ошибка, что виджет deactivated. Я надеюсь, что с большим количеством кода каждый сможет понять, почему я не могу поймать ошибку и распечатать ее на консоли   -  person FlutterFirebase    schedule 27.10.2019


Ответы (1)


У меня была такая же проблема.

Ошибка возникает из-за того, что вы используете один из 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();
  }
}
person wamfous    schedule 21.01.2020
comment
Я не уверен, что моя проблема была точно такой же, но в моем коде было несколько неиспользуемых notifiyListeners, и я получил эту ошибку ... Удаление решило ее !!! - person Chris; 30.03.2020