【问题标题】:Value property doesn't update for dropdownfield when I do setState in flutter当我在颤动中执行 setState 时,下拉字段的值属性不会更新
【发布时间】:2020-05-23 20:23:06
【问题描述】:

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

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

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

最初选择第 5 课时选择 A 作为所选科目。

当我选择第 4 小时时,新列表是从 API 获取的,但我收到“item not in dropdownbuttonitemlist error”。

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

hour 5 items image

hour 5 selected image

error after selecting hour 4

sn-ps 如下:

下拉按钮:

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

提前感谢您的帮助!

【问题讨论】:

    标签: flutter dart statefulwidget dropdownbutton


    【解决方案1】:

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

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

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

    【讨论】:

    • 在添加新元素之前我正在清理列表。问题是 DropDownButtonFormField 的 value 属性没有更新为 setState 上的新值。列表很干净,我也检查了列表的值。即使在 setState 之后,DropDownButtonFormField 的值仍然来自旧列表。新列表不包含任何具有相同值的项目。
    • 好吧,这个错误描述性不是很强,但是检查 DropdownButtonFormField 小部件的断言构造函数,您会注意到它需要一个非空或 null 项,值不应该不能为空或为空。因此,请检查您是否使用空字符串/空值或项目列表 lis,如果是,则在列表为空或为空时显示文本小部件。当您的元素列表为空或为空时,Flutter 似乎不喜欢您使用 DropdownButtonFormField 小部件。
    • 是的,我花了 3 天时间来解决这个问题。如果您需要动态下拉菜单,请使用 DropdownButton 代替 DropdownButtonFormField。我已经把答案放在下面了。
    【解决方案2】:

    问题在于DropdownButtonFormField

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

    使用 DropdownButton 代替或将表单键分配给 DropdownButtonFormField 并在您需要动态/多级下拉列表时清除 setState 中的表单需要即时更新。

    这就是我要解决的问题。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2021-08-18
      • 2022-07-26
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多