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

时间:2021-04-07 15:07:05

标签: flutter drop-down-menu flutter-layout

我有一个代码,其中我使用 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'),
                          );
                        }
                      },
                    ),

1 个答案:

答案 0 :(得分:0)

您与所有磁贴共享相同的变量 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],