如何使用导航器传递提供者?

Flu*_*ase 8 dart flutter flutter-provider

我需要Model2homepageto传递 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)

感谢帮助!

rah*_*aha 8

在导航到新页面时,您可以通过创建新的提供程序轻松地在导航器中传递提供程序。

 Navigator.of(context).push(
      MaterialPageRoute(
        builder: (BuildContext context) => Provider(
          create: (context) => InventoryItem(),
          builder: (context, child) => ProductDetails(),
        ),
      ),
    );
Run Code Online (Sandbox Code Playgroud)

这里要么创建一个新对象,InventoryItem()要么传递现有的提供者对象。


Dan*_*Szy 3

您需要使 Provider 出现在 Navigator Widget 上方,作为当前 Widget 的锚点。这意味着,它必须位于MaterialApp()或您可能使用的CupertinoApp()任何内容之上Directionality()

有关 InheritedWidget 的更多信息,请参阅以下链接。

https://medium.com/@mehmetf_71205/inheriting-widgets-b7ac56dbbeb1

https://www.youtube.com/watch?v=Zbm3hjPjQMk