找不到正确的提供者-Flutter

时间:2019-08-17 18:53:52

标签: flutter dart flutter-provider

@override   小部件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)
                          ],
                        ),
                      ],
                    ),
                  ),
                ),
              ),
            ),
          ),
        ),
      )
    ],
  ),
);

}

当我弹出InApp()类时,我尝试修改numberOfCoins变量。 但是我有以下错误:

  

[VERBOSE-2:ui_dart_state.cc(148)]未处理的异常:错误:可以   在这个FantasyNbi窗口小部件上方找不到正确的提供程序

     

要修复,请:

     
      
  • 确保提供者是这个FantasyNbi的祖先   小部件*为提供者提供类型*为   消费者*向Provider.of()提供类型      
        
    • 始终使用包导入。例如:import 'package:my_app/my_code.dart'; * Ensure the correct context`是   被使用。
    •   
  •   

2 个答案:

答案 0 :(得分:9)

根据提供程序包的最新版本,builder()的{​​{1}}方法已更改为ChangeNotifierProvider。 因此,编辑 Esen Mehmet 的版本,将改为:

create()

答案 1 :(得分:0)

您需要在builderChangeNotifierProvider之间建立Scaffold桥梁。

Provider软件包已经拥有自己的生成器Consumer,您可以像这样使用它:

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

检查此链接:https://pub.dev/packages/provider#reading-a-value