我已经使用DropdownButton
和TextField
小部件编写了相当广泛的表格。概念是我有一个StatefulWidget
,其中的类State
包含2个方法,这些方法返回要构建的小部件。这样,我可以轻松地访问和使用输入的数据,并将其传递给功能以将它们组成电子邮件。
但是,当我从选项中选择一个项目时,框架在重建期间会引发异常。我放入了一些日志函数,它表明该setState()
方法成功地将值保存为selectedValue
变量。
Widget buildMultiChoiceInputRow(var label, Listvalues) { 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((DropdownMenuItemitem) => 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中的一个先前的错误,但是如果我尝试初始化selection
and selectedValue
in initState()
,则将在第一次构建表单时抛出相同的异常。
我在这里想念什么?
您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或为“黄色”或“棕色”或“银色”。
在我被困住的第二种情况下,扩展了以上答案。
您的DropdownButton的“值”应设置为“空”或为值列表中的一个。
您的“价值”在每个商品价值上也应有所不同。
例如:避免这种情况
items.add(DropdownMenuItem( value: 1.toString(), child: Text(1.toString()), )); items.add(DropdownMenuItem( value: 1.toString(), child: Text(1.toString()), ));
避免重复这些值。