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