Could not find the correct Provider - Flutter

心已入冬 提交于 2020-03-02 08:00:25

问题


@override Widget build(BuildContext context) {

return WillPopScope(
  onWillPop: () async {
    return false;
  },
  child: Stack(
    children: <Widget>[
      DefaultTabController(
        length: 5,
        child: ChangeNotifierProvider(
          builder: (context) => MySchedule(),
          child: (
              Scaffold(
                appBar: AppBar(
                  actions: <Widget>[
                    Container(
                      width: MediaQuery.of(context).size.width,
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: <Widget>[
                          GestureDetector(
                            onTap: () async{
                              await Navigator.of(context).push(
                                MaterialPageRoute(builder: (context){
                                  return InApp();
                                })
                              );
                              final MySchedule schedules = Provider.of<MySchedule>(context);
                              schedules.numberOfCoins = 10;
                            },
                            child: Card(
                              child: Padding(
                                padding: const EdgeInsets.all(4.0),
                                child: Row(
                                  children: <Widget>[
                                    Consumer<MySchedule>(
                                      builder: (context, coin, _) =>
                                          buildCoinBar(coin),
                                    ),
                                    SizedBox(
                                      width: 2,
                                    ),
                                    Stack(
                                      children: <Widget>[
                                        Image.asset('assets/coin2.png',
                                          height: 22, width: 22,),

                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ),
                          ),
                          Image.asset('assets/LOGO.png'),
                          Consumer<MySchedule>(
                            builder: (context, userdata, _) =>
                                topRightElement(userdata, context),
                          ),
                        ],
                      ),
                    )
                  ],
                  automaticallyImplyLeading: false,
                  bottom: TabBar(
                    labelStyle: TextStyle(fontSize: 8),
                    tabs: [
                      Consumer<MySchedule>(
                        builder: (context, schedule, _) =>
                        buildNewCardNotification(schedule),
                      ),
                      Tab(icon: Icon(Icons.star), text: 'Csapatom' ,),
                      Tab(icon: Icon(Icons.verified_user), text: 'Forduló',),
                      Tab(icon: Icon(Icons.stars), text: 'Kártyáim',),
                      Tab(icon: Icon(Icons.account_balance), text: 'Ligák',),
                    ],
                  ),
                ),
                body: TabBarView(
                  children: [
                    Office(),
                    MyTeam(),
                    MatchListView(),
                    MyCardView(),
                    ChampionshipView2(),
                  ],
                ),
              )
          ),
        ),
      ),
      Visibility(
        visible: msgVisible,
        child: SafeArea(
          child: GestureDetector(
            onTap: (){
              setState(() {
                msgVisible = false;
              });
            },
            child: Padding(
              padding: const EdgeInsets.all(2.0),
              child: ClipRRect(
                borderRadius: BorderRadius.circular(0.0),
                child: Card(
                  shape: RoundedRectangleBorder(
                      side: new BorderSide(color: Colors.lightGreenAccent, width: 2.0),
                      borderRadius: BorderRadius.circular(16.0)),
                  elevation: 8,
                  color: Colors.black87,
                  child: Container(
                    height: 64,
                    width: MediaQuery.of(context).size.width,
                    child: Row(
                      children: <Widget>[
                        Padding(
                          padding: const EdgeInsets.all(10.0),
                          child: Image.asset('assets/LOGO.png', height:44),
                        ),
                        Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: <Widget>[
                            Text(title, style: TextStyle(
                              fontSize: 16,
                              color: Colors.lightGreenAccent
                            ),),
                            Text(body,
                              overflow: TextOverflow.ellipsis)
                          ],
                        ),
                      ],
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      )
    ],
  ),
);

}

I try to modify the numberOfCoins variable, when I pop the InApp() class. But I have the following error:

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Error: Could not find the correct Provider above this FantasyNbi Widget

To fix, please:

  • Ensure the Provider is an ancestor to this FantasyNbi Widget * Provide types to Provider * Provide types to Consumer * Provide types to Provider.of()
    • Always use package imports. Ex: import 'package:my_app/my_code.dart'; * Ensure the correctcontext` is being used.

回答1:


You need a builder bridge between ChangeNotifierProvider and Scaffold.

Provider package already has it's own builder called Consumer, you can use it like:

ChangeNotifierProvider(
          builder: (context) => MySchedule(),
          child: Consumer<MySchedule>(
                  builder: (context, provider, child) => Scaffold(....,

Check this link: https://pub.dev/packages/provider#reading-a-value




回答2:


According to the latest version of the Provider package, the builder() method of ChangeNotifierProvider was changed to create(). So editing Esen Mehmet's version, this will work instead:

ChangeNotifierProvider(
      create: (context) => MySchedule(),  //change builder to create
      child: Consumer<MySchedule>(
              builder: (context, provider, child) => Scaffold(....,


来源:https://stackoverflow.com/questions/57539094/could-not-find-the-correct-provider-flutter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!