从一个屏幕切换到另一个屏幕时,如何不丢失列表中的数据? [英] How to not lose a data from the list when going from one screen to another screen in flutter?

查看:58
本文介绍了从一个屏幕切换到另一个屏幕时,如何不丢失列表中的数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类 ViewTotalItemProvider ,它扩展了ChangeNotifier.在班级内部,有一个像这样的列表.

I have a class ViewTotalItemProvider which extends the ChangeNotifier. Inside the class, there is a list like this.

class ViewTotalItemProvider extends ChangeNotifier{
List<CartPlantLists> cartPlantList3 = [];
}

此外,还有3个屏幕,包括诸如 PlantFeatureScreen1 ParticlePlant2 CartDetais3 之类的屏幕.所有这些都是有状态的小部件,我在第二个屏幕中添加了一些项目,即 ParticularPlant2 类.

当我尝试在第二个屏幕和第三个屏幕中显示列表中的项目时,它起作用了.
但是该值不会在firstScreen(即 PlantFeatureScreen1 )中更新.但是,当我重新加载应用程序时,它会显示更新后的值.
为什么会这样呢?我该怎么解决?

Additionally, there are 3 screens including class like, PlantFeatureScreen1, ParticularPlant2, CartDetais3. All are stateful widget and I am adding some items in second screen i.e. ParticularPlant2 class.

When I try to show the items from list in the second screen and the third screen it works.
But the value is not updated in the firstScreen i.e. PlantFeatureScreen1. However, when I reload the app, it shows the updated value.
why is this happening? How can I solve it?

代码
ViewTotalItemProvider

Code
ViewTotalItemProvider

List<CartPlantLists> cartPlantList3 = [];

class ViewTotalItemProvider extends ChangeNotifier{

  addQuantity(index){
     cartPlantList3[index].qu++;
    notifyListeners();
  }

  subtrachQuantity(index){
    cartPlantList3[index].qu--;
    notifyListeners();

  }
}

firstScreen PlantFeatureScreen1 (在这里我要更新最后一个小部件中的值)

firstScreen PlantFeatureScreen1 (Here I want to update the value in the very last widget)

class PlantFeatureScreen1 extends StatefulWidget {
  @override
  _PlantFeatureScreen1State createState() => _PlantFeatureScreen1State();
}

class _PlantFeatureScreen1State extends State<PlantFeatureScreen1> {


  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ViewTotalItemProvider>(
      create: (context) => ViewTotalItemProvider(),
      child:Builder(builder: (context) {
        return           Column(
        children: <Widget>[
          TopAppBar(),
          Expanded(
            flex: 1,
            child: Align(
              alignment: Alignment(-1, 0),
              child: Container(
                decoration: BoxDecoration(
                  color: Colors.white,
                ),
                child: Text(
                  "Plants",
                  style: TextStyle(fontSize: 30, fontWeight: FontWeight.w700),
                ),
              ),
            ),
          ),
          Expanded(
            flex: 5,
            child: Container(
              width: double.infinity,
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
              child: DefaultTabController(
                length: 5,
                child: Column(
                  children: [
                    Container(
                      height: 50,
                      width: double.infinity,
                      child: TabBar(
                        isScrollable: true,
                        tabs: ourAllLists.tabMaker(),
                      ),
                    ),
                    Container(
                      height: 317,
                      width: double.infinity,
                      decoration: BoxDecoration(color: Colors.white),
                      child: TabBarView(
                        children: ourAllLists.tabViewerMaker(context),),),
                  ],
                ),
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(20, 0, 20, 20),
            child: Container(
              alignment: Alignment.bottomRight,
              height: 120,
              width: double.infinity,
              child: Stack(
                overflow: Overflow.visible,
                children: [
                  Container(
                    height: 70,
                    width: 105,
                    decoration: BoxDecoration(
                        color: Color(0xFF96CA2D),
                        borderRadius: BorderRadiusDirectional.horizontal(
                            end: Radius.circular(32),
                            start: Radius.circular(32))),
                            child: Icon(FontAwesomeIcons.shoppingBag,color:Colors.white,size:30),
                  ),
                  Positioned(
                    // top: 0,
                    bottom: 50,
                    right: 0,
                    child: Consumer<ViewTotalItemProvider>(
                      builder: (context, value, child){
                        return Container(
                        height: 35,
                        width: 35,
                        decoration: BoxDecoration(
                          color: Colors.white,
                          borderRadius: BorderRadius.circular(50),
                          border: Border.all(color: Color(0xFF96CA2D),width: 4)
                        ),
                        child: Center(child: Text(ourAllLists.totalquantity().toString(),style:TextStyle(fontSize: 20,color: Color(0xFF96CA2D)))),
                      );
                      }),                
                    ),
                ],
              ),
            ),
          )
        ],
      );   
      })
 );
  }
}

secondScreen ParticlePlant2

secondScreen ParticularPlant2

class ParticularPlant2 extends StatefulWidget {
  final indexNumber;
  ParticularPlant2({@required this.indexNumber});

  @override
  _ParticularPlant2State createState() => _ParticularPlant2State();
}

class _ParticularPlant2State extends State<ParticularPlant2> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          body: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              TopAppBar(),
              Container(
                decoration: BoxDecoration(
                  color: Colors.red,
                  borderRadius: BorderRadiusDirectional.only(
                    bottomStart: Radius.circular(50),
                  ),
                ),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(
                      ourAllLists
                          .mainListAllPlantDetailsList1[widget.indexNumber].pN,
                      style: kPlantNameStyle,
                    ),
                    Text(
                      ourAllLists
                          .mainListAllPlantDetailsList1[widget.indexNumber].ca
                          .toUpperCase(),
                      style: TextStyle(
                        fontSize: 15,
                      ),
                    ),
                    Text(
                      "\$" +
                          ourAllLists
                              .mainListAllPlantDetailsList1[widget.indexNumber]
                              .pr
                              .toString(),
                      style: kItemPrice,
                    ),
                    SizedBox(height: 100),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: [
                        Column(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: [
                            Container(
                              height: 80,
                              width: 80,
                              decoration: BoxDecoration(
                                  color: Colors.white,
                                  borderRadius: BorderRadius.circular(50)),
                              child: Icon(
                                FontAwesomeIcons.flag,
                                color: Color(0xFF9DCD3C),
                              ),
                            ),
                            SizedBox(
                              height: 50,
                            ),
                            FlatButton(
                              onPressed: () {
                                final tile = cartPlantList3.firstWhere(
                                    (item) =>
                                        item.pN ==
                                        ourAllLists
                                            .mainListAllPlantDetailsList1[
                                                widget.indexNumber]
                                            .pN,
                                    orElse: () => null);
                                if (tile != null) {
                                } else {
                                  cartPlantList3.add(
                                    CartPlantLists(
                                      quantity: 1,
                                      plantName: ourAllLists
                                          .mainListAllPlantDetailsList1[
                                              widget.indexNumber]
                                          .pN,
                                      category: ourAllLists
                                          .mainListAllPlantDetailsList1[
                                              widget.indexNumber]
                                          .ca,
                                      price: ourAllLists
                                          .mainListAllPlantDetailsList1[
                                              widget.indexNumber]
                                          .pr,
                                    ),
                                  );
                                }
                                print(cartPlantList3.length);
                              },
                              child: Container(
                                height: 80,
                                width: 80,
                                decoration: BoxDecoration(
                                    color: Color(0xFF9DCD3C),
                                    borderRadius: BorderRadius.circular(50)),
                                child: Icon(FontAwesomeIcons.shoppingBag,
                                    color: Colors.white),
                              ),
                            )
                          ],
                        ),
                        Container(
                          height: 250,
                          child: Image(image: AssetImage("assets/tulip.png")),
                        )
                      ],
                    )
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

推荐答案

似乎您使用Provider的方式错误.在您的方案中,执行此操作的最佳方法是使用MultiProvider将MaterialApp包裹在main.dart文件中的MyApp()中.尝试这样的操作: https://pub.dev/packages/provider#multiprovider 在其中放置一个ChangeNotifierProvider.

It seems like you are using Provider the wrong way. The best way to do this in your scenario is to wrap MaterialApp inside MyApp() in your main.dart file with MultiProvider. Try something like this: https://pub.dev/packages/provider#multiprovider You can place a ChangeNotifierProvider inside it.

return MultiProvider(
  providers: [
    ChangeNotifierProvider<ViewTotalItemProvider>(
        create: (context) => ViewTotalItemProvider()),
  ],
  child: MaterialApp(...)
);

此外,您还必须在模型中放置一个吸气剂和吸气剂.这是一个示例:

Also, you have to place a getter and setter in your Model. Here is an example:

class ImageModel extends ChangeNotifier {
  String _base64Image;
  get base64Image => _base64Image;
  set base64Image(String base64Image) {
    _base64Image = base64Image;
    notifyListeners();
  }
}

我还建议您使用Selector代替Consumer(理想情况下,您应该使用Selector代替Consumer,这样小部件仅在其侦听的值发生更改时才重建)这是基于上述模型的示例:

I would also recommend using Selector instead of Consumer (Ideally, you should use Selector instead of Consumer so that the widget only rebuilds if the value its listening to changes) Here is an example based on the model above:

@override
Widget build(BuildContext context) {
 //other widgets
 Selector<ImageModel, String>(
  selector: (_, model) => model.base64Image,
  builder: (_, image, __) {
   return Text(image);
     },
   );
  }
 )
}

以下是使用RaisedButton进行设置的方法:

Here is how you can get and set it using a RaisedButton:

class _PlantFeatureScreen1State extends State<PlantFeatureScreen1> {
  final itemModel;
  List<CartPlantLists> myList=[];
  @override
  Widget build(BuildContext context) {
    itemModel = Provider.of<ViewTotalItemProvider>(context,listen:false);
    print(itemModel.yourVariable); //getting the value
    return Container(
             child: RaisedButton(
               child:Text("Set Item");
               onPressed:(){
               itemModel.yourVariable=myList; //setting the value
               },
             ),
    );
  }
 }

希望这会有所帮助!祝你好运!

Hope this helps! Good Luck!

这篇关于从一个屏幕切换到另一个屏幕时,如何不丢失列表中的数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆