在app主页上,我设置了Model2,使API调用数据。然后用户可以导航到其他页面(Navigator.push)。但是我想在用户按下( Model2 ) (_onBackPress())时从_onBackPress()调用API,这样就可以在主页上刷新数据。当我打电话时,它会出错:
未处理的异常:错误:无法找到此消费者Widget之上的正确提供程序
如果我将Consumer添加到Page2中,则会产生错误:
错误:找不到正确的提供程序在此消费品Widget之上
主页中的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)),在Page2中:
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();
},
),
],
),
);
},
);
}发布于 2022-06-22 13:34:41
也许有点麻烦,但是在您的模型/提供程序类上重写dispose()方法似乎有效。
例如,如果您有一个作为视图提供者提供的视图模型:
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();
}https://stackoverflow.com/questions/57581287
复制相似问题