我要添加到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永远不会更新以将新项目显示为选中状态。
答案 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。