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

Другие вопросы по тегам