【问题标题】:Error: Could not find the correct Provider<CartList> above this Consumer<CartList> Widget in flutter错误:在颤动中找不到此 Consumer<CartList> 小部件上方的正确 Provider<CartList>
【发布时间】:2020-06-29 18:29:23
【问题描述】:

这是运行应用程序代码的一部分:

 Navigator.of(context).pushReplacement(MaterialPageRoute(
                  builder: (BuildContext context) => _number != null?ChangeNotifierProvider(
                    create: (context)=>CartList(),
                    child: HomeScreenDemo(),
                  ):Login())));

我也尝试过使用 MultiProvider 代替 ChangeNotifierProvider,但没有奏效。

这是主屏幕代码的一部分:

 Widget build(BuildContext context) {
    return  Consumer<CartList>(
      builder: (context,CART,child){
        return  Scaffold(
          key: scaffoldKey,
          backgroundColor: Colors.black,
)

这就是我导航到结帐屏幕的方式:

  Navigator.of(context).push(MaterialPageRoute(
                                    builder: (context) => CartScreen(userPin: _userPin,)
                                  ));

这是结账界面的代码:

 Widget build(BuildContext context) {
    return Builder(builder: (BuildContext context)=>Consumer<CartList>(
        builder: (context,cart,child){
          return  Scaffold(
            backgroundColor: Colors.black,

我尝试在 Consumer 之前删除 builder 但没有成功。

这是错误截图:

这里我推路线:


   showCart? Align(
                        alignment: Alignment.bottomCenter,
                        child: Padding(
                          padding: const EdgeInsets.all(12.0),
                          child: Container(

                            decoration: BoxDecoration(
                              borderRadius: BorderRadius.circular(8),color: Colors.cyan,

                            ),
                            child: Material(
                              color: Colors.transparent,
                              child: InkWell(
                                splashColor: Colors.black12,
                                onTap: () {
                                  //  Cart OnClick
                                  Navigator.of(context).push(MaterialPageRoute(
                                      builder: (context) => ChangeNotifierProvider.value(
                                          value: Provider.of<CartList>(context, listen: false),
                                          child: CartScreen(userPin: _userPin,)
                                      )
                                  ));
                                },
                                child: Container(
                                  width:MediaQuery.of(context).size.width,
                                  decoration: BoxDecoration(
                                    borderRadius: BorderRadius.circular(8),

                                  ),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.spaceBetween,

                                    children: <Widget>[
                                      Column(
                                        mainAxisAlignment: MainAxisAlignment.start,
                                        crossAxisAlignment: CrossAxisAlignment.start,
                                        children: <Widget>[
                                          Text(CART.count<=1?CART.count.toString()+"  ITEM":CART.count.toString()+"  ITEMS",style: TextStyle(
                                              letterSpacing: 1.5,fontWeight: FontWeight.w400
                                          ),),
                                          SizedBox(height: 5,),
                                          Text(" ₹"+CART.totalPrice.toString().replaceAll(regex, "")),
                                        ],
                                      ),
                                      SizedBox(width: 160,),
                                      Text('Cart ',style: TextStyle( fontSize: 18,letterSpacing: .5,fontWeight: FontWeight.w400),textAlign: TextAlign.end,),
                                      Icon(Icons.arrow_right,size: 30,),

                                    ],
                                  ),
                                  padding: EdgeInsets.all(10),
                                  height: 60,


                                ),
                              ),
                            ),
                          ),
                        ),
                      ):Container()

【问题讨论】:

  • 使用上一级提供者
  • 您陷入了错误消息中描述的第一种情况。您尝试读取的提供程序可能在不同的路径中。
  • @SachinBhankhar,我应该怎么做,在哪里,你能分享一个sn-p的代码吗?真的很感激。
  • @RémiRousselet,我在哪里做错了,我在我使用 Provider 的地方分享了我的整个代码。
  • 您能否提供您正在推送路线的完整小部件

标签: flutter dart flutter-provider


【解决方案1】:

检查 Android Studio 或 VS 中的小部件树,您会看到在推送路由时,它只使用上面的 MaterialApp(除非您在 MaterialApp 之前创建提供程序)重新开始,因此没有 CartList 可以使用,将其包装在ChangeNotifierProvider.value 以公开以前创建的提供程序

Navigator.of(context).push(MaterialPageRoute(
     builder: (_) => ChangeNotifierProvider.value( //this context change its name to something else to avoid confusion
       value: Provider.of<CartList>(context, listen: false),
       child: CartScreen(userPin: _userPin,)
     )
));

【讨论】:

  • 错误:在此 Builder 小部件上方找不到正确的 Provider。出现此错误。
  • 它不会像官方文档所说的那样工作,不要使用 ChangeNotifierProvider.value 来创建对象
  • 我不是在创造,我是在将它的价值暴露给下一条路线
  • pub.dev/packages/provider#-readme-tab- 查看部分显示您应该使用 Provider 而不是 Provider.value 的值
  • 如果你已经有一个对象实例并且想要暴露它,你应该使用提供者的.value构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 2021-01-31
  • 2020-08-21
  • 2021-07-23
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多