微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在flutter中在不同屏幕和appBar之间使用provider

如何解决在flutter中在不同屏幕和appBar之间使用provider

我在我的 Flutter 应用中使用了 Provider。我能够用另一个小部件更改一个小部件,而无需使用设置状态。太棒了!

我的特点是,当我点击“Añadir al carrito”按钮时,购物车上的数字会发生变化,并逐一增加

这是我放在按钮中的代码部分,它位于使用 provider.of 的脚手架主体内部:


    final _numCompras = Provider.of<MyShoppingCart>(context);
    return Padding(
      padding: const EdgeInsets.only(top: 15.0),child: GestureDetector(
        onTap: () {
          _numCompras.numCompras = _numCompras.numCompras + 1;
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: const Text('Producto Añadido'),duration: const Duration(seconds: 1),action: SnackBaraction(
              label: '',onpressed: () {

              },),));
        },child: Container(
          height: 80,width: double.infinity,decoration: Boxdecoration(
            color: Constants.kColorRojo,borderRadius: BorderRadius.circular(60),border: Border.all(width: 1,color: Colors.black),child: Padding(
            padding: const EdgeInsets.all(10.0),child: Row(
              mainAxisAlignment: MainAxisAlignment.center,children: [
                Text(
                  'Añadir al Carrito',style: TextStyle(
                    color: Colors.white,fontFamily: 'Poppins',fontSize: 20,SizedBox(
                  width: 15,Icon(
                  Icons.shopping_cart_outlined,color: Colors.white,size: 30,],);
  }

这是我使用 ChangeNotifier 的类

  int _numCompras = 0;

  get numCompras => _numCompras;
  set numCompras(int newValue) {
    _numCompras = newValue;
    notifyListeners();
  }
}

在我的 main.dart 中,我放置了 ChangeNotifierProvider,因为我认为它包含所有其余的小部件。

class JuniorsApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<MyShoppingCart>(
          create: (context) => MyShoppingCart(),//builder:,)
      ],child: MaterialApp(
        theme: ThemeData.light().copyWith(
          primaryColor: Color(0xFFd51921),scaffoldBackgroundColor: Color(0xFFf2f2f2),home: PageStart(),initialRoute: PageStart().ID_PageStart,routes: {
          page_IniciarSesion().ID_PageIniciarSesion: (context) =>
              page_IniciarSesion(),PageStart().ID_PageStart: (context) => PageStart(),RegistroNombrePage().ID_PageRegistroNombre: (context) =>
              RegistroNombrePage()
        },debugShowCheckedModeBanner: false,);
  }
}

最后是我要更改的小部件的 appBar 代码

Widget build(BuildContext context) {
    bool _hasBackButton = hasBackArrow ?? true;
    final height = MediaQuery.of(context).size.height;
    final width = MediaQuery.of(context).size.width;
    return Selector<MyShoppingCart,int>(
      selector: (_,model) => model.numCompras,builder: (context,numCompras,_) {
        return SafeArea(
          child: Material(
            elevation: 15,child: Padding(
              padding: EdgeInsets.symmetric(horizontal: 16),child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
                  if (_hasBackButton)
                    RoundedIconButton(
                      iconData: Icons.arrow_back_ios,press: () {
                        Navigator.pop(context,MaterialPageRoute(
                          builder: (context) {
                            return Selector(builder: (context,_){},selector: (_,model) => model.numCompras);
                          },)
                        );
                      }
                    ),Text(
                    this.title == null ? 'Junior \'s Tacos' : this.title,style: Constants.kFuenteAppBar,this.hasCart
                      ? _widgetShoppingCar(context,height,width,numCompras)
                      : Spacer(),);
      },);
  }
Widget _widgetShoppingCar(context,_numCompras) {
    return Stack(
      children: [
        RoundedIconButton(
          iconData: Icons.shopping_cart_outlined,press: () {
            _viewShop = !_viewShop;
            this.changeAppBarShop(_viewShop);
            /*Navigator.push(
              context,MaterialPageRoute(
                builder: (context) => CartPage(),);*/
          },Positioned(
          bottom: height * 0.04,left: width * 0.09,child: Container(
            width: width * 0.05,height: height * 0.025,decoration: Boxdecoration(
                color: Colors.red[500],border: Border.all(
                  color: Colors.red[500],borderRadius: BorderRadius.all(Radius.circular(20))),child: Center(
                child: Text(
              '${_numCompras}',style: TextStyle(
                fontWeight: FontWeight.bold,)),);
  }

问题是它工作正常,但是当我从 appBar 执行 Navigator.pop 时。购物车的计数归零。

Here is how its working at the moment

有人可以给我一个提示吗?

谢谢!

解决方法

好吧,如果有人遇到这种问题。我的问题是我有两个 ChangeNotifierProvider。一个在我的 main.dart 中,另一个在包含按钮的小部件中。我删除了最后一个,现在它可以工作了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。