首页 > 解决方案 > 错误:找不到正确的提供者高于此消费者颤振中的小部件

问题描述

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

 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(" ₹&quot;+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()

标签: flutterdartflutter-provider

解决方案


检查 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,)
     )
));

推荐阅读