Как помешать Провайдеру избавиться от модели?
На главной странице приложения я настроил 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();
}