Выбранный элемент 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):

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 Отображается правильно с первым выбранным элементом, но когда я выбираю другой элемент, пользовательский интерфейс никогда не обновляется, чтобы показать новый элемент как выбранный.


person lahsrah    schedule 27.03.2019    source источник


Ответы (2)


Вам нужно инициализировать список только один раз, потому что не будет совпадения для значения DropDownList, если вы создаете новый список при каждом розыгрыше.

Рабочий пример можно найти здесь: Gist

person knezzz    schedule 27.03.2019
comment
Ваш ответ не работает. Он вылетает с: I/flutter ( 5072): 'package:flutter/src/material/dropdown.dart': Неудачное утверждение: строка 560 pos 15: 'items == null || I/флаттер ( 5072): items.isEmpty || значение == ноль || items.where((DropdownMenuItem‹T› item) =› item.value == I/flutter ( 5072): value).length == 1': неверно. - person lahsrah; 27.03.2019
comment
Если вы хотите попробовать запустить, полный код здесь: gist.github.com/lahsrah/0267bd0e0f6797203e4d4a7a4946219d< /а> - person lahsrah; 27.03.2019
comment
если хотите, отредактируйте свой ответ, и я отмечу его как ответ, чтобы отдать вам должное. - person lahsrah; 27.03.2019

Попробуйте инициализировать переменную _selectedCar в методе initState() вместо метода getDropdown().

Согласно опубликованному вами коду, переменная _selectedCar повторно инициализируется каждый раз, когда вы вызываете setState(), поскольку вызывается метод build().

Также вы упомянули, что получаете следующую ошибку при попытке решения в первом ответе:

I/flutter (5072): 'package:flutter/src/material/dropdown.dart': Неудачное утверждение: строка 560 поз. 15: 'items == null || I/флаттер ( 5072): items.isEmpty || значение == ноль || items.where((DropdownMenuItem item) => item.value == I/flutter ( 5072): value).length == 1': неверно.

Скорее всего, это связано с тем, что несколько элементов в раскрывающемся списке получают одинаковое значение.

Возможным решением может быть использование параметра id объекта Car в качестве раскрывающегося списка value вместо всего объекта, поскольку id будет уникальным для каждого объекта. Более подробную информацию об этой ошибке можно найти здесь.

person thebuggycoder    schedule 27.03.2019