更新时所有下拉菜单更新 ||颤动||

问题描述

我有一个代码,其中我使用 listview.builder 创建不同的下拉菜单项,我面临的问题是,当任何一个更新时,不同下拉菜单中的所有项目都会更新。

我在下面附上了我的代码。您对解决此问题的帮助将不胜感激。 为了更容易理解,我还附上了具体发生了什么的屏幕截图。 enter image description here

StreamBuilder<QuerySnapshot>(
                      stream: FirebaseFirestore.instance
                          .collection(
                              '${widget.destination}rates'.toLowerCase())
                          .snapshots(),builder: (context,snapshot) {
                        if (!snapshot.hasData) {
                          return Text('Loading..');
                        } else {
                          List<DropdownMenuItem> tourName = [];
                          var selectedTour =
                              List(int.parse(widget.duration) + 1);
                          for (int i = 0;
                              i < snapshot.data.docs.length;
                              i++) {
                            DocumentSnapshot snap = snapshot.data.docs[i];
                            tourName.add(
                              DropdownMenuItem(
                                child: Text(snap['name']),value: '${snap['name']}',),);
                          }
                          return DropdownButton(
                            items: tourName,onChanged: (value) {
                              setState(() {
                                selectedTour[i] = value;
                                print(selectedTour);
                              });
                            },value: selectedTour[i],isExpanded: true,hint: Text('Select Tour'),);
                        }
                      },

解决方法

您与所有磁贴共享相同的变量 selectedTour。 因此,当您更新选择时:

setState(() {
    selectedTour = value;
});

它会在所有 selectedTour 用于显示所选值的地方更新。

您可以使用新的局部变量:

                } else {
                  List<DropdownMenuItem> tourName = [];
                  var selectedTourLocal = null;
                  for (int i = 0; i < snapshot.data.docs.length; i++)  
...
                      setState(() {
                        selectedTourLocal = value;
                      });  
...
                    value: selectedTourLocal,

或者使用数组将值存储到相应的日期。

// declare your array
selectedTour = new List(widget.duration);
...
                      setState(() {
                        selectedTour[i] = value;
                      });
...
                    value: selectedTour[i],

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...