DropDownButton所选项目在UI中未更改

时间:2019-03-27 11:45:05

标签: dart flutter dropdownbutton

我要添加到DropDownButton中的对象:

class Car {
  int id;
  String make;

  Car(this.id, this.make);

  static List<Car> getCars() {
    var cars = new List<Car>();
    cars.add(Car(1, "Ford"));
    cars.add(Car(2, "Toyota"));
    cars.add(Car(3, "BMW"));

    return cars;
  }
}

构造DropDown(StatefulWidget State类):

class _MyHomePageState extends State<MyHomePage> {
  Car _selectedCar;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(child: getDropDown()));
  }

  Widget getDropDown() {
    var cars = Car.getCars();
    this._selectedCar = cars.first; // Default to first value in list.
    var items = cars.map((car) {
      return new DropdownMenuItem<Car>(
        value: car,
        child: new Text(car.make),
      );
    }).toList();

    return DropdownButton<Car>(
        value: this._selectedCar,
        onChanged: (Car car) {
          setState(() {
            this._selectedCar = car;
          });
        },
        items: items);
  }
}

DropDownButton在选择了第一个项目的情况下可以正确显示,但是当我选择另一个项目时,UI永远不会更新以将新项目显示为选中状态。

2 个答案:

答案 0 :(得分:1)

您只需初始化一次列表,因为如果您在每次绘制中都初始化新列表,则DropDownList值将不匹配。

可在此处找到工作示例:Gist

答案 1 :(得分:0)

请尝试在_selectedCar方法而不是initState()方法中初始化getDropdown()变量。

根据您发布的代码,由于调用了_selectedCar方法,因此每次调用setState()时,build()变量都会重新初始化。

您还提到在尝试第一个答案的解决方案时遇到以下错误:

  

I / flutter(5072):'package:flutter / src / material / dropdown.dart':   断言失败:行560位置15:'item == null ||我/颤振(   5072):items.isEmpty ||值== null ||   items.where(((DropdownMenuItem item)=> item.value == I / flutter(   5072):value).length == 1':不正确。

这很可能是因为下拉菜单中有多个项目获得了相同的值。

可能的解决方法是使用id对象的Car参数作为下拉列表value而不是整个对象,因为id对于每个对象都是唯一的宾语。有关此错误的更多详细信息,请参见here