【问题标题】:How to change FormBuilderDropdown selected value using setState?如何使用 setState 更改 FormBuilderDropdown 选定值?
【发布时间】:2020-05-20 06:14:11
【问题描述】:

我有来自flutter_form_builder 的以下FormBuilderDropdown 定义供用户选择美国州

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

【问题讨论】:

  • 看你的代码widget.initialvalue好像是StatefulWidget中的一个属性。你能把它作为变量放在_StateFormBuilderDropdownState 中并检查一下。
  • 我安装了软件包并测试了FormBuilderDropdown 小部件,它会自动在下拉列表中设置选定的值。如果您需要在其他地方使用该值,那么您应该从 onChanged 中获取 if 并将其传递。
  • @Abhilash Chandran:我认为这不会有什么不同,如果您检查FormBuilderDropdown 的代码,参数initialvalue 仅用于initState。该代码不是在每次构建时都执行,而是在第一次构建时执行
  • @João Soares:问题不是提取选定的下拉值,而是使用setState以编程方式更改它
  • @StackOverflower 你是对的。看起来formsbuilder没有重置这个值。然而,基本的DropDownButton 公开了一个value 属性,可以重置它来实现这一点。如果您有兴趣,我将分享代码,该代码还利用提供程序包来提示状态更改重建。

标签: flutter flutter-form-builder


【解决方案1】:

我认为你可以使用 UniqueKey()。就我而言,如果使用 initialValue,我需要以编程方式重置 formbuildercheckboxlist 值。

我把它发到另一个post

【讨论】:

    【解决方案2】:

    当值发生变化时,您可以使用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),
        );
      }
    

    【讨论】:

      【解决方案3】:

      使用 Keys 来强制 Flutter 重新初始化FormBuilderDropdown 怎么样?只需添加key: const Key(widget.initialValue.toString()) 就可以使FormBuilderDropdown 在每次widget.initialValue 更改时通过initState,就好像它是一个全新的小部件一样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多