#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. Спасибо. Я думал, что это может быть как-то связано с передачей функции, но я просто не понял это правильно. Большое спасибо