Dart/flutter : DropdownButton causes exception when value is changed

标签 dart flutter

我用 DropdownButton 写了一个相当广泛的表格和 TextField小部件。这个概念是我有一个 StatefulWidget ,其中 State<StatefulWidget> 的类包含 2 个返回我要构建的小部件的方法。通过这种方式,我可以轻松访问和使用输入的数据,并将其传递给一个函数来编写一封电子邮件。

但是,当我从选项中选择一个项目时,框架会在重建期间引发异常。我输入了一些日志函数,它显示 setState()方法成功将值保存到 selectedValue变量。

Widget buildMultiChoiceInputRow(var label, List<String> values) {
    final List<String> options = values.toList();
    selection = options.first;

    final dropDownMenuOptions = options.map((String value) {
      return new DropdownMenuItem<String>(
        value: value,
        child: new Text(value),
      );
    }).toList();

    return new Column(
      children: <Widget>[
        new Row(
          children: <Widget>[
            new Expanded(
              child: new Container(
                  padding:
                      const EdgeInsets.only(left: 5.0, top: 2.0, right: 5.0),
                  child: new Text(label, style: commonInfoCardInfoTextBlack16Bold)),
            ),
          ],
        ),
        new Row(
          children: <Widget>[
            new Expanded(
              child: new Container(
                padding: const EdgeInsets.only(left: 5.0, right: 5.0),
                child: new DropdownButton(
                value: selectedValue,
                items: dropDownMenuOptions,
                onChanged: (selection) {
                  setState(() {
                    selectedValue = selection;
                    switch (label) {
                      case labelVirtualAdoption:
                        tempAdoptionType =
                            composeMultiChoiceAnswer(label, selection);
                            print(selection);
                            print(selectedValue);
                        break;
                          case labelAskedAboutSpecies:
                            tempAskedAboutSpecies =
                                composeMultiChoiceAnswer(label, selection);
                            break;
                          case labelHouseOrFlat:
                            tempHouseOrFlat =
                                composeMultiChoiceAnswer(label, selection);
                            break;
                            ....
                          default:
                            break;
                        }
                      });
                    }),
              ),
            )
          ],
        ),
        new Divider(color: Colors.transparent)
      ],
    );
  }

这是一个异常(exception):

I/flutter (20998): The following assertion was thrown building AdoptionInput(dirty, state: AdoptionInputState#3cc80):
I/flutter (20998): 'package:flutter/src/material/dropdown.dart': Failed assertion: line 481 pos 15: 'value == null ||
I/flutter (20998): items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.

这里是堆栈,显示在重建过程中抛出了异常:

I/flutter (20998): #2      new DropdownButton (package:flutter/src/material/dropdown.dart)
I/flutter (20998): #3      AdoptionInputState.buildMultiChoiceInputRow (package:osszefogasaszanhuzokert/adoptionPageUtilities.dart:443:28)
I/flutter (20998): #4      AdoptionInputState.build (package:osszefogasaszanhuzokert/adoptionPageUtilities.dart:639:11)
I/flutter (20998): #5      StatefulElement.build (package:flutter/src/widgets/framework.dart:3730:27)
I/flutter (20998): #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3642:15)
I/flutter (20998): #7      Element.rebuild (package:flutter/src/widgets/framework.dart:3495:5)
I/flutter (20998): #8      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2242:33)

这个问题看起来很像 a former bug in flutter ,但是如果我尝试初始化 selectionselectedValueinitState() ,第一次构建表单时将抛出相同的异常。

我在这里错过了什么?

最佳答案

DropdownButton 的“值”应设置为“null”或值列表中的一个。

DropdownButton(
      value: null,
      isDense: true,
      onChanged: (String newValue) {
        // somehow set here selected 'value' above whith 
       // newValue
       // via setState or reactive.
      },
      items: ['yellow', 'brown', 'silver'].map((String value) {
        return DropdownMenuItem(
          value: value,
          child: Text(value),
        );
      }).toList(),
    ),

因此对于我的示例 DropdownButton 值应设置为 null 或为“黄色”或“棕色”或“银色”。

关于 Dart/flutter : DropdownButton causes exception when value is changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50384426/

相关文章:

Flutter : Attempt to remove non-JNI local reference, 倾销线程

flutter - 我想为 ListView 中的每个特定项目创建动画

ios - Flutter 登录苹果失败

flutter - Flutter:PageView保持停留在上一个屏幕

flutter 降级错误 - channel 没有先前记录的版本

firebase - 本地通知与FCM:哪个正确?

flutter - 在 flutter web 中添加依赖

validation - Flutter:将一系列可接受的值和多个条件设置为 TextFormField 验证器

flutter - 带 flutter 的最低安卓版本

android - 类型 'Null' 不是类型 'Function' 的子类型