【问题标题】:Trying to get TextFormField data from another widget试图从另一个小部件获取 TextFormField 数据
【发布时间】:2021-10-19 20:03:56
【问题描述】:

我正在构建一个从 JSON 数据生成表单字段的应用程序。 Form 小部件在 custom_form.dart 中声明

 child: Form(
    key: _globalKey,
    child: Column(
      children: [
        SizedBox(
          height: 10,
        ),
        Text("Register Form: "),
        SizedBox(
          height: 3,
        ),
        for (var i = 0; i < this.widget.widgetList.length; i++)
          generateWidgetFromType(this.widget.widgetList[i]),

我正在使用 generateWidgetFrom 类型来生成小部件

Widget generateWidgetFromType(Mywidget mywidget) {
  switch (mywidget.type) {
    case "CheckBox":
      return GenerateCheckBox(mywidget);
    case "Input":
      return CustomGeneratedWidget(mywidget,
          onSaved: (value) => widget.test = value);
    case "DatePicker":
      return GenerateDatePicker(mywidget);
  }
  return Text("This type is not supported yet");
}

TextFormField 在 CustomGeneratedWidget 中声明

  child: TextFormField(
      controller: textEditingController,
      obscureText: isPasswordField(this.widget.mywidget.key),
      keyboardType: customType(this.widget.mywidget.key),
      decoration: InputDecoration(
          labelText: this.widget.mywidget.label,
          border: OutlineInputBorder()),
      validator: (value) {

当我单击 custom_form.dart 中的添加按钮时,我想从 CustomGeneratedWidget 中的 TextFormField 中检索数据

【问题讨论】:

    标签: flutter dart mobile


    【解决方案1】:

    一种方法可能是将一个名为 getValue() 的方法添加到您的 CustomGeneratedWidget 类中:

    class CustomGeneratedWidget extends Mywidget {
        TextEditingController textEditingController = TextEditingController();
    
        ...
        String getValue() {
          return textEditingController.text;
        }
    
        ...
    
        @override
        Widget build(BuildContext context) {
           ...
        }
    }
    

    我猜测,根据您正在构建的内容,您最终不仅希望从 TextFormField / CustomGeneratedWidget 实例中获取数据,还希望从 GenerateCheckBoxGenerateDatePicker 实例中获取数据.在这种情况下,如果是我,我会在 Mywidget 中添加一个抽象方法,您可以在其子类中覆盖它,可能称为 getValue()。所以,Mywidget 可能看起来像:

    abstract class Mywidget extends Widget {
        ...
    
        // this method is purposefully unimplemented, and is therefore an "abstract" method
        dynamic getValue();  
    
        ...
    }
    

    在您的子类中,例如 CustomGeneratedWidget,您可以通过重新定义/实现它来“覆盖”此方法,从而使其“具体化”:

    class CustomGeneratedWidget extends Mywidget {
        TextEditingController textEditingController = TextEditingController();
        ...
    
        @override
        String getValue() {
            return textEditingController.text;
        } 
    
        @override
        Widget build(BuildContext context) {
           return Container(
              child: TextFormField(
                 controller: textEditingController
                 ...
              )
           );
        }
    }
    

    回到custom_form.dart,在“添加”按钮的处理程序中,您可以浏览已创建的Mywidget 实例列表并在每个实例上调用getValue()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-08
      • 2022-11-12
      • 2020-02-22
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多