1

我有以下定义供用户选择美国FormBuilderDropdownflutter_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

4 回答 4

1

我认为您可以使用 UniqueKey()。就我而言,如果使用initialValue.

我把它贴在另一个帖子上

于 2020-04-25T17:03:13.343 回答
0

如何使用 Keys 来强制 Flutter 重新初始化FormBuilderDropdown?只需添加即可key: const Key(widget.initialValue.toString()),这样每次都会FormBuilderDropdown更改,就好像它是一个全新的小部件一样。initStatewidget.initialValue

于 2020-02-23T09:15:11.463 回答
0

您可以在值更改时使用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),
    );
  }
于 2020-02-23T10:02:50.960 回答
0

重置下拉菜单以防止由于设置一个没有当前值的不同列表而导致错误。

//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
于 2022-03-03T15:50:23.273 回答