Flutter / Dart: многократное использование виджета и возврат значения setState

#flutter #dart

#flutter #dart

Вопрос:

Я использую DropdownButton виджет много раз на одной странице в моем приложении. Чтобы предотвратить перезапись кода, я хотел бы использовать виджет один раз и передавать ему значения. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно установить значение «value», которое не может возникнуть при передаче аргумента упомянутому методу. Как можно повторно использовать структуру виджета и использовать ее setState для нескольких разных значений? Мой пример ниже:

 String trial;

Widget build(BuildContext context) {
return SafeArea(
  child: Scaffold(
    body: Column(
      children: [
            //TRIAL
            dropDownLists(
              hint: "Trial",
              items: ["1", "2", "3", "4"],
              value: trial, //<---This value does not update when option chosen
            ),
      ],
    ),
  ),
);
}
  

//Метод

 Widget dropDownLists({String hint, List<String> items, String value}) {
    print(value); //<--- null, but giving a value throws errors because a value 
                  //doesn't match an item on the list
    return DropdownButton<String>(
      hint: Text(hint),
      value: value,
      onChanged: (selectedValue) {
        print(selectedValue);
        print(value);
        setState(() {
          value = selectedValue;
        });
      },
      items: items.map((String selection) {
        return DropdownMenuItem<String>(
          value: selection,
          child: Text(selection),
        );
      }).toList(),
    );
  }
  

Проблема: выпадающий список работает до тех пор, пока не потребуется выбрать значение. После выбора значения оно не отображается как выбранное

Теория: в настоящее время я не возвращаю значение должным образом, но не знаю, как это сделать.

Ответ №1:

вы можете сделать это следующим образом:

 String trial;

Widget build(BuildContext context) {
  return SafeArea(
    child: Scaffold(
      body: Column(
        children: [
          dropDownLists(
            hint: "Trial",
            items: ["1", "2", "3", "4"],
            value: trial,
            onChange: (value) => setState(() => trial = value),
          ),
        ],
      ),
    ),
  );
}

Widget dropDownLists({
  String hint,
  List<String> items,
  String value,
  Function(String) onChange,
}) {
  print(value);

  return DropdownButton<String>(
    hint: Text(hint),
    value: value,
    onChanged: onChange,
    items: items.map((String selection) {
      return DropdownMenuItem<String>(
        value: selection,
        child: Text(selection),
      );
    }).toList(),
  );
}
  

Комментарии:

1. Спасибо. Я думал, что это может быть как-то связано с передачей функции, но я просто не понял это правильно. Большое спасибо