0

我正在从 API 动态更新下拉表。当我选择一个小时时,会从 API 中检索相应的主题。

假设我在几个小时之间切换。

第 5 小时有科目 A 和 B,而第 4 小时只有科目 B。

最初选择第 5 小时时,选择 A 作为所选主题。

当我选择第 4 小时时,新列表是从 API 获得的,但我得到“项目不在 dropdownbuttonitemlist 错误中”。

我知道这是因为 DropDownMenuField 的 value 属性,这就是为什么我在从 API 成功检索信息时将值设置为 null 的原因。

小时 5 项目图像

小时 5 所选图像

选择第 4 小时后出错

片段如下:

下拉按钮:

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

提前谢谢你的帮助!

4

2 回答 2

0

让我更好地理解你的问题。您是否正在清理列表_subjectDropDownItems,因为您从四个选项中添加的新元素似乎包含重复值。

因此,您可以使用Set<String> = {}结构来防止这些重复,因为 DropdownButton 不允许。

如果您仍然需要显示重复的值,您可以创建一个类作为 的值DropdownMenuItem,像这样DropdownMenuItem<YourClass>,添加一个 id 并覆盖==运算符或尝试来自Pub.dev的Equatable库用于相同目的。

于 2020-05-23T23:41:28.027 回答
0

问题出在DropdownButtonFormField.

DropdownButtonFormField不允许使用 将值更新为新值setState

当您需要需要动态更新的动态/多级下拉菜单时,请改用DropdownButton或分配表单键DropdownButtonFormField并清除表单。setState

这就是我所做的修复。

于 2020-05-24T18:08:49.227 回答