Flutter-下拉值

时间:2019-05-13 11:57:35

标签: flutter dropdown

我需要在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();   

5 个答案:

答案 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,);
    }
  ),