Как помешать Провайдеру избавиться от модели?

На главной странице приложения я настроил Model2 которые делают вызов API для данных. Пользователь может перейти на другую страницу (Navigator.push). Но я хочу сделать вызов API из Model2 когда пользователь нажимает назад (_onBackPress()) так что можете обновить данные на главной странице. Когда я звоню, выдает ошибку:

Необработанное исключение: ошибка: не удалось найти правильного поставщика выше этого виджета потребителя

Если я добавлю Consumer Page2 это выдает ошибку:

Ошибка: не удалось найти правильного поставщика выше этого виджета потребителя

StatefulWidget на домашней странице:

@override
  Widget build(BuildContext context) {
return ChangeNotifierProxyProvider<Model1, Model2>(
initialBuilder: (_) => Model2(),
  builder: (_, model1, model2) => model2
    ..string = model1.string,
),
  child: Consumer<Model2>(
    builder: (context, model2, _) =>

...
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondRoute(context: context)),

На странице 2:

  final context;

  Page2State({Key key, this.context});
...

//    Consumer<Model2>(
//    builder: (context, model2, _) =>
    ...
          onWillPop: () => _onBackPress(context),
...

Future<void> _onBackPress(context) async {

final model2 = Provider.of<Model2>(context, listen: false);

  return showDialog<void>(
    context: context,
    barrierDismissible: false, 
    builder: (BuildContext context) {
      return 


    Provider.value(value: model2, child:


AlertDialog(
        title: Text('Back'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              Text('Go back'),
            ],
          ),
        ),
        actions: <Widget>[
          FlatButton(
            child: Text('OK'),
            onPressed: () async {
await model2.getData();

              Navigator.of(context).pop();
            },
          ),
        ],
),
      );
    },
  );
}

1 ответ

Возможно, немного хакерский, но переопределение метода в классах вашей модели/поставщика, похоже, работает.


Например, если у вас есть модель представления, предлагаемая в качестве поставщика для вашего представления:

      class View extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      lazy: false,
      create: (context) => ViewModel(),
      builder: (context, child) {
        return Scaffold(
...
}
      class ViewModel with ChangeNotifier {
...
  @override
  // ignore: must_call_super
  void dispose() {}
}

Это предотвратит автоматическое удаление модели механизмом поставщика. Конечно теперь у тебя бесполезныйdispose()метод, поэтому вам может понадобиться реализовать какой-то другой метод, который вызываетsuper.dispose()чтобы освободить ресурсы, когда это необходимо:

        void myDispose() {
    super.dispose();
  }
Другие вопросы по тегам