DropDownButton在UI中选择的项目没有改变。

5 浏览
0 Comments

DropDownButton在UI中选择的项目没有改变。

我想在我的DropDownButton中添加的对象:

class Car {

int id;

String make;

Car(this.id, this.make);

static List getCars() {

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正确显示第一项被选中,但当我选择另一项时,界面从未更新以显示新选择项。

0
0 Comments

问题的原因是_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)。

0
0 Comments

问题的原因是在每次绘制时都初始化了一个新的列表,导致下拉列表框的值无法匹配。解决方法是只初始化列表一次,确保每次绘制时都使用同一个列表。

可以在这里找到一个可行的示例:[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)。

如果你愿意,请编辑你的答案,我会将其标记为正确答案,以便给予你信用。

0