Dart 下拉按钮所选项目为';在UI中不改变

Dart 下拉按钮所选项目为';在UI中不改变,dart,flutter,dropdownbutton,Dart,Flutter,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"));

我想在我的
下拉按钮中添加的对象:

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;
  }
}
等级车{
int-id;
串制;
汽车(这个id,这个品牌);
静态列表getCars(){
var cars=新列表();
加上(汽车(1,“福特”);
添加(汽车(2,“丰田”);
汽车。添加(汽车(3,“宝马”);
返回车辆;
}
}
构建下拉列表(StatefulWidget状态类):

class\u MyHomePageState扩展状态{
汽车(u selected Car);;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
主体:中心(子对象:getDropDown());
}
小部件getDropDown(){
var cars=Car.getCars();
这。\ u selectedCar=cars.first;//默认为列表中的第一个值。
var项目=汽车。地图((汽车){
返回新的DropdownMenuItem(
价值:汽车,
子项:新文本(car.make),
);
}).toList();
返回下拉按钮(
值:此。\u选择的汽车,
变更后:(汽车){
设置状态(){
这个。\ u selectedCar=car;
});
},
项目:项目;;
}
}

DropDownButton
在选择第一个项目时正确显示,但当我选择另一个项目时,UI不会更新以显示选定的新项目。

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


这里的工作示例:

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


此处的工作示例:

尝试在
initState()
方法中初始化
\u selectedCar
变量,而不是
getDropdown()
方法

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

您还提到,在尝试第一个答案中的解决方案时,会出现以下错误:

I/flatter(5072):“包装:flatter/src/material/dropdown.dart”: 断言失败:第560行第15位:“items==null | | I/flatter( 5072):items.isEmpty | | value==null|| items.where((DropdownMenuItem)=>item.value==I/颤振( 5072):值)。长度==1':不为真

这很可能是因为下拉列表中的多个项目获得相同的值


可能的修复方法是使用
Car
对象的
id
参数作为下拉
值,而不是整个对象,因为
id
对于每个对象都是唯一的。可以找到有关此错误的更多详细信息。

尝试在
initState()
方法中初始化
\u selectedCar
变量,而不是
getDropdown()
方法

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

您还提到,在尝试第一个答案中的解决方案时,会出现以下错误:

I/flatter(5072):“包装:flatter/src/material/dropdown.dart”: 断言失败:第560行第15位:“items==null | | I/flatter( 5072):items.isEmpty | | value==null|| items.where((DropdownMenuItem)=>item.value==I/颤振( 5072):值)。长度==1':不为真

这很可能是因为下拉列表中的多个项目获得相同的值


可能的修复方法是使用
Car
对象的
id
参数作为下拉
值,而不是整个对象,因为
id
对于每个对象都是唯一的。可以找到有关此错误的更多详细信息。

您的答案无效。它崩溃于:I/flatter(5072):'package:flatter/src/material/dropdown.dart':失败的断言:第560行位置15:'items==null | | | I/flatter(5072):items.isEmpty | | value==null | | items.where((DropdownMenuItem)=>item.value==I/flatter(5072):value)。长度==1':不正确。如果要尝试运行,这里代码的全部要点是:哦,是的,好吧,你每次都会得到新的列表,所以没有一个对象匹配。这里是工作版本:如果你想编辑你的答案,我会把它标记为答案给你评分。你的答案不起作用。它崩溃于:I/flatter(5072):'package:flatter/src/material/dropdown.dart':失败的断言:第560行位置15:'items==null | | | I/flatter(5072):items.isEmpty | | value==null | | items.where((DropdownMenuItem)=>item.value==I/flatter(5072):value)。长度==1':不正确。如果要尝试运行,这里代码的全部要点是:哦,是的,好吧,你每次都会得到新的列表,所以没有一个对象匹配。这里是工作版本:如果你想编辑你的答案,我会把它标记为答案,给你评分。
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);
  }
}