Flu*_*ase 8 dart flutter flutter-provider
我需要Model2
从homepage
to传递 provider( )Page2
以便当用户返回homepage
( onWillPop
) 我可以从 provider( Model2
)进行 API 调用并更新homepage
。
但是当我打电话时_onPaidBackPress(context)
出现错误:
未处理的异常:错误:在此消费者小部件上方找不到正确的提供者
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, _) =>
...
await Navigator.push(
context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new Page2(
context: context)));
Run Code Online (Sandbox Code Playgroud)
在第 2 页:
class Page2 extends StatefulWidget {
final BuildContext context;
Page2({Key key, this.context}) : super(key: key);
@override
State createState() => new Page2State(context: context);
}
class Page2State extends State<Page2> {
final context;
ChatScreenState({Key key, this.context});
@override
Widget build(BuildContext context) {
return Consumer<Model1>(
builder: (context, model, _) {
return new WillPopScope(
onWillPop: () => model.isPaid ? _onPaidBackPress(context) : _onBackPressed(context),
Future<void> _onPaidBackPress(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();
},
),
],
),
);
},
);
}
Run Code Online (Sandbox Code Playgroud)
感谢帮助!
在导航到新页面时,您可以通过创建新的提供程序轻松地在导航器中传递提供程序。
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) => Provider(
create: (context) => InventoryItem(),
builder: (context, child) => ProductDetails(),
),
),
);
Run Code Online (Sandbox Code Playgroud)
这里要么创建一个新对象,InventoryItem()
要么传递现有的提供者对象。
您需要使 Provider 出现在 Navigator Widget 上方,作为当前 Widget 的锚点。这意味着,它必须位于MaterialApp()
或您可能使用的CupertinoApp()
任何内容之上Directionality()
。
有关 InheritedWidget 的更多信息,请参阅以下链接。
https://medium.com/@mehmetf_71205/inheriting-widgets-b7ac56dbbeb1
https://www.youtube.com/watch?v=Zbm3hjPjQMk
归档时间: |
|
查看次数: |
8013 次 |
最近记录: |