Как изменить выбранное значение FormBuilderDropdown с помощью setState?
У меня есть следующие FormBuilderDropdown
от flutter_form_builder
определение для пользователя, чтобы выбрать штат США
class _StateFormBuilderDropdownState extends State<StateFormBuilderDropdown> {
@override
Widget build(BuildContext context) {
return FormBuilderDropdown(
attribute: widget.attribute,
initialValue: widget.initialValue,
validators: [FormBuilderValidators.required()],
decoration: InputDecoration(labelText: "State (required)"),
hint: Text('Select State'),
items: List<DropdownMenuItem>.from(
UsStates.states.map((s) => DropdownMenuItem(
value: s.code, child: Text(s.name)
))
),
onChanged: widget.onChanged
);
}
}
Когда я перехожу к этому экрану, я выполняю обратное геокодирование для автозаполнения адреса пользователя.
Когда адрес решен, я звоню setState
для изменения значений формы. Проблема в том, чтоFormBuilderDropdown
иметь только initialValue
доступно для установки значения, и, насколько мне известно, оно не оценивается снова после первой сборки, поэтому я не могу использовать его для изменения значения.
Как я могу изменить FormBuilderDropdown
после первоначальной настройки?
4 ответа
Сбросьте раскрывающийся список, чтобы предотвратить ошибку из-за настройки другого списка, в котором нет текущего значения.
//Create key
final _dropDownKey = GlobalKey<FormBuilderFieldState>();
//Reference the key
FormBuilderDropdown(key:_dropDownKey)
//Then reset using the key where ever you want
_dropDownKey.currentState!.reset();
_dropDownKey.currentState!.setValue(null);
//Then you can safely assign a different list of values to the drop down
Я думаю, вы можете использовать UniqueKey(). В моем случае мне нужно программно сбросить значение formbuildercheckboxlist при использованииinitialValue
.
Я разместил это в другом посте
Вы можете использовать ValueListenableBuilder
перестроить FormBuilderDropdown
при изменении значения.
ValueNotifier notifier;
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: notifier,
builder: FormBuilderDropdown(
attribute: widget.attribute,
initialValue: notifier.value,
validators: [FormBuilderValidators.required()],
decoration: InputDecoration(labelText: "State (required)"),
hint: Text('Select State'),
items: List<DropdownMenuItem>.from(UsStates.states.map(
(s) => DropdownMenuItem(value: s.code, child: Text(s.name)))),
onChanged: (value) => notifier.value = value),
);
}
Как насчет использования ключей, чтобы заставить Flutter повторно инициализировать FormBuilderDropdown
? Просто добавивkey: const Key(widget.initialValue.toString())
должен сделать так, чтобы FormBuilderDropdown
идет через initState
каждый раз widget.initialValue
меняется, как будто это совершенно новый виджет.