API からドロップダウン テーブルを動的に更新しています。時間を選択すると、対応する件名が API から取得されます。
私が時間を切り替えているとしましょう。
5 時間目には被験者 A と B がいて、4 時間目には被験者 B だけがいます。
5 時間は、選択された主題として A で最初に選択されます。
時間 4 を選択すると、API から新しいリストが取得されますが、「項目がドロップダウン ボタン項目リストにありません」というエラーが表示されます。
これは DropDownMenuField の value 属性が原因であることを理解しています。そのため、API からの情報の取得が成功したときに値を null に設定しました。
スニペットは以下のとおりです。
ドロップダウン ボタン:
DropdownButtonFormField<String>(
isExpanded: true,
style: new TextStyle(
fontFamily: "Poppins",
fontWeight: FontWeight.w400,
color: Colors.black,
),
decoration: InputDecoration(
contentPadding: const EdgeInsets.all(0),
labelText: "Select subject",
labelStyle: TextStyle(
fontFamily: "Poppins",
fontWeight: FontWeight.w200,
color: Colors.black,
),
),
value: subjectController,
onChanged: (value) {
setState(() {
pk_table =
pk_table_array[subject_array.indexOf(value)];
required_timestamp = required_timestamp_array[
subject_array.indexOf(value)];
subjectController = value;
buttonActive = true;
});
},
items: _subjectDropDownItems,
),
setState メソッド (API のフェッチが成功したときに呼び出されます):
setState(() {
subjectController = null;
buttonActive = true;
subject_array.forEach((subject) {
if (subjectController == null) {
print("updated value");
subjectController = subject;
}
_subjectDropDownItems.add(new DropdownMenuItem(
child: new Text(subject.toString()),
value: subject.toString(),
));
});
});
subjectController は State クラスの属性として定義されています。
そして、これはエラーです:
There should be exactly one item with [DropdownButton]'s value: IT8551B - Web Technology Laboratory B.
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
事前に助けてくれてありがとう!