您好,我是 Flutter 的新手,我正在尝试DropdownButton
根据 Firebase 后端中的不同文档创建多个 s。由于可能有多个DropdownButton
(不同的文档有不同数量的下拉列表要创建),我想用 List<String> formInput
(formInput[0]
保持第一个DropdownButton
值等)来维护那里的值。
但是我一直遇到这个错误,并得出结论,这是formInput[i]
错误的。所以我的问题是为什么我不能formInput[i]
用作下拉按钮的值?不formInput[i]
考虑一件?是否有更好的解决方案来维护未知数量的值?
非常感谢
代码:
class _SubmissionFormState extends State<SubmissionForm> {
List<String> formInput;
var test;
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return FutureBuilder(
future: getStringFromPref('site'),
builder: (context, snapshot) {
if (snapshot.hasData) {
String site = snapshot.data;
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection('form')
.where('name', isEqualTo: site)
.snapshots(),
builder: (context, snapshot) {
if (snapshot.hasData) {
int inputSize = snapshot.data.documents.length;
List<Widget> listOfWidget = [];
formInput = new List<String>.filled(inputSize, '-');
print(formInput.length);
for (int i = 0; i < inputSize; i++) {
DocumentSnapshot snap = snapshot.data.documents[i];
List<DropdownMenuItem> options = [];
// adding drop down menu items
for (int j = 0; j < snap['formVal'].length; j++) {
String formVal = snap['formVal'][j];
options.add(DropdownMenuItem(
child: Text(
formVal,
),
value: formVal,
));
print('[inner loop] for loop $i ' + snap['formVal'][j]);
}
// the list of DropdownButtons
listOfWidget.add(DropdownButton(
value: formInput[i],
items: options,
hint: Text(
"-",
),
onChanged: (value) {
setState(() {
formInput[i] = value;
});
},
));
// listOfWidget.add(Text(snap['formTxt']));
}
return Column(
children: listOfWidget,
);
} else {
return CircularProgressIndicator();
}
});
} else {
return CircularProgressIndicator();
}
},
);
}
}
错误:
I/flutter (30860): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (30860): The following assertion was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
I/flutter (30860): _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#60d57):
I/flutter (30860): There should be exactly one item with [DropdownButton]'s value: -.
I/flutter (30860): Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
I/flutter (30860): 'package:flutter/src/material/dropdown.dart':
I/flutter (30860): Failed assertion: line 839 pos 15: 'items == null || items.isEmpty || value == null ||
I/flutter (30860): items.where((DropdownMenuItem<T> item) {
I/flutter (30860): return item.value == value;
I/flutter (30860): }).length == 1'
I/flutter (30860):