当前位置:  开发笔记 > 编程语言 > 正文

飞镖/颤振:更改值时,DropdownButton导致异常

如何解决《飞镖/颤振:更改值时,DropdownButton导致异常》经验,为你挑选了2个好方法。

我已经使用DropdownButtonTextField小部件编写了相当广泛的表格。概念是我有一个StatefulWidget,其中的类State包含2个方法,这些方法返回要构建的小部件。这样,我可以轻松地访问和使用输入的数据,并将其传递给功能以将它们组成电子邮件。

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

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

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

    return new Column(
      children: [
        new Row(
          children: [
            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: [
            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)
      ],
    );
  }

这是例外:

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 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)

这个问题似乎确实类似于flutter中的一个先前的错误,但是如果我尝试初始化selectionand selectedValuein initState(),则将在第一次构建表单时抛出相同的异常。

我在这里想念什么?



1> 小智..:

您DropdropButton的“值”应设置为“ 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或为“黄色”或“棕色”或“银色”。



2> vivek yadav..:

在我被困住的第二种情况下,扩展了以上答案。

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

您的“价值”在每个商品价值上也应有所不同。

例如:避免这种情况

 items.add(DropdownMenuItem(
  value: 1.toString(),
  child: Text(1.toString()),
));
items.add(DropdownMenuItem(
  value: 1.toString(),
  child: Text(1.toString()),
));

避免重复这些值。

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有