Как остановить модель после dispose ()? - PullRequest
0 голосов
/ 29 октября 2019

Я использую Provider и ChangeNotifier для отделения бизнес-логики от пользовательского интерфейса. Но у меня есть проблема, когда Model удаляется до завершения выполнения функции. Потому что тогда он все еще notifyListeners() и вызывает ошибку:

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

Я написал mwe, чтобы показать это:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Widget1(),
    );
  }
}

class Widget1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () async {
            await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => Widget2(),
                ));
          },
        ),
      ),
    );
  }
}


class Widget2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        builder: (_) => Model(),
        child: Consumer<Model>(builder: (context, model, _) {
          return Scaffold(body: Center(
            child: RaisedButton(
              child: model.success ? Icon(Icons.check) : Icon(Icons.error),
              onPressed: () async {
//              Press back button before Future finish
                await model.init();
              },
            ),
          ));
        }));
  }
}



class Widget3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(child: Text('Widget 3'));
  }
}


class Model extends ChangeNotifier {
  bool success = false;

  Future<void> init() async {
    await Future.delayed(Duration(seconds: 5));
    success = true;
    notifyListeners();
  }
}

Как я могу подключить пользовательский интерфейс (Widget2) и Model (например, чтобы отобразить правильный значок) без этой ошибки?

...