我需要在flutter下拉列表中使用字符串作为值。但是回报
引发了另一个异常: 'package:flutter / src / material / dropdown.dart':断言失败:行 609排名15:“ item == null || items.isEmpty ||值== null || items.where(((DropdownMenuItem item)=> item.value == value).length == 1':不正确。
完整日志here。
代码是
items: dataMaker.map((item) {
return new DropdownMenuItem<String>(
child: new Text(item['fabricante'],
textAlign: TextAlign.center),
value: item['fabricante'], //FAIL
);
}).toList(),
所以我的问题在:我如何使用字符串作为项目值?另一个解决方案是获取下拉菜单的文本,但我不知道如何。
-解决方案-
使用此代码,我可以在dataMaker列表中找到与下拉菜单具有相同文本的所有元素。
var test =dataMaker.firstWhere((fabricante) => fabricante["id"].toString() == dropdownSelectionMaker);
dataModelo = dataMaker.where((modelo) => modelo["fabricante"] == test["fabricante"]).toList();
答案 0 :(得分:2)
DropdownButton
小部件具有以下断言
assert(items == null || items.isEmpty || value == null ||
items.where((DropdownMenuItem<T> item) {
return item.value == value;
}).length == 1,
"There should be exactly one item with [DropdownButton]'s value: "
'$value. \n'
'Either zero or 2 or more [DropdownMenuItem]s were detected '
'with the same value',
)
在此断言中,以下部分失败并返回空列表
items.where((DropdownMenuItem<T> item) {
return item.value == value;
})
就我而言,我正在使用包含其他几个属性的类的对象
我覆盖了该课程的== operator
,它起作用了!
以下是操作符覆盖的示例
class Person {
String name;
int id;
Person(this.name, this.id);
bool operator ==(o) => o is Person && o.name == name && o.id == id;
}
答案 1 :(得分:0)
您可以尝试这种方法, 那就是我有时使用的方式。
我在普通TextEditor中创建的代码可能包含一些问题。
items: (){
List<Widget> data = List<Widget>();
for(int i=0;i<dataMaker.length;i++){
data.add(
DropdownMenuItem<String>(
child: Text(item['fabricante'],
textAlign: TextAlign.center),
value: item['fabricante'],
);
);
}
return data;
}
答案 2 :(得分:0)
尝试这一希望对您有用:
day
答案 3 :(得分:0)
我不确定库如何进行比较,但是我发现尽管该值在他的列表中,但仍返回错误,因此我不得不进行一些操作比较。
这是我的案例的神奇之处:
value: selectedType == null ? selectedType : buildingTypes.where( (i) => i.name == selectedType.name).first as BuildingType,
return DropdownButton<T>(
hint: Text("Select Building type"),
value: selectedType == null ? selectedType : buildingTypes.where( (i) => i.name == selectedType.name).first as BuildingType,
onChanged: handleBuildingTypeChange,
items: abcList.map((T value) {
return DropdownMenuItem<T>(
value: value,
child: Row(
children: <Widget>[
SizedBox(
width: 10,
),
Text(
value.name,
style: TextStyle(color: Colors.black),
),
],
),
);
}).toList(),
);
答案 4 :(得分:0)
在这里工作正常,
StreamBuilder(
stream: bloc.selecionado$,
builder: (context, snapshot) {
if(snapshot.hasData){
return DropdownButton(
items: bloc.listAtletas.value.map( (v){
return DropdownMenuItem<AtletasObj>(
child: Text("${v.nome}"),
value: v,
);
}).toList(),
value: bloc.selecionado.value,
isDense: true,
onChanged:(v){bloc.changeAtletaSelecionado(v); bloc.changeObjetoSelecionadoFunction(v);},
);
}
return Container(height: 0.0, width: 0.0,);
}
),