DropDownButton在UI中选择的项目没有改变。
DropDownButton在UI中选择的项目没有改变。
我想在我的DropDownButton中添加的对象:
class Car {
int id;
String make;
Car(this.id, this.make);
static List
var cars = new List
cars.add(Car(1, "Ford"));
cars.add(Car(2, "Toyota"));
cars.add(Car(3, "BMW"));
return cars;
}
}
构建DropDown(StatefulWidget状态类):
class _MyHomePageState extends State
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; // 默认选择列表中的第一个值。
var items = cars.map((car) {
return new DropdownMenuItem
value: car,
child: new Text(car.make),
);
}).toList();
return DropdownButton
value: this._selectedCar,
onChanged: (Car car) {
setState(() {
this._selectedCar = car;
});
},
items: items);
}
}
DropDownButton正确显示第一项被选中,但当我选择另一项时,界面从未更新以显示新选择项。
问题的原因是_selectedCar变量在getDropdown()方法中被重新初始化,导致在调用setState()时,_selectedCar变量的值被重置。解决方法是将_selectedCar变量的初始化放在initState()方法中而不是getDropdown()方法中。
另外,如果尝试了第一个答案中的解决方法后出现了下面的错误信息:
I/flutter ( 5072): 'package:flutter/src/material/dropdown.dart':
Failed assertion: line 560 pos 15: 'items == null || I/flutter (
5072): items.isEmpty || value == null ||
items.where((DropdownMenuItem item) => item.value == I/flutter (
5072): value).length == 1': is not true.
这很可能是因为下拉列表中有多个项具有相同的值。一个可能的修复方法是使用Car对象的id参数作为下拉列表的value,而不是使用整个对象,因为每个对象的id将是唯一的。有关此错误的更多详细信息可以在这里找到(链接为https://stackoverflow.com/questions/49273157)。
问题的原因是在每次绘制时都初始化了一个新的列表,导致下拉列表框的值无法匹配。解决方法是只初始化列表一次,确保每次绘制时都使用同一个列表。
可以在这里找到一个可行的示例:[Gist](http://gist.github.com/knezzz/7cc3bb75992413cb43f1d2a3328b7295)。
之前给出的答案并不适用,会导致崩溃并出现错误信息:'package:flutter/src/material/dropdown.dart': Failed assertion: line 560 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem item) => item.value == value).length == 1': is not true。
如果你想尝试运行,请查看完整的代码:[gist.github.com/lahsrah/0267bd0e0f6797203e4d4a7a4946219d](https://gist.github.com/lahsrah/0267bd0e0f6797203e4d4a7a4946219d)。
是的,你每次都获取了一个新的列表,所以没有任何对象匹配。这里是可行版本的代码:[gist.github.com/knezzz/7cc3bb75992413cb43f1d2a3328b7295](https://gist.github.com/knezzz/7cc3bb75992413cb43f1d2a3328b7295)。
如果你愿意,请编辑你的答案,我会将其标记为正确答案,以便给予你信用。