【问题标题】:Flutter : Custom TextFormField is not saving values onSavedFlutter:自定义 TextFormField 不保存值 onSaved
【发布时间】:2019-09-12 09:16:16
【问题描述】:

onSaved 没有将我的值保存在我调用此类的主类中

我想根据 api 返回数据生成自定义表单并将数据绑定到表单中,然后它应该在颤振中调用 validate 进行验证

我已经创建了用于生成表单字段的自定义文本表单字段

在主类中,我使用带有 for 循环的 listview 来生成一个列表,然后我的表单将进行验证

class CustomTextField extends StatefulWidget {
CustomTextField(
  {@required this.focusNode,
  @required this.nextFocusNode,
  @required this.textEditingController,
  @required this.validator,
  @required this.labelText,
  @required this.dataText});

final FocusNode focusNode;
final FocusNode nextFocusNode;
 final TextEditingController textEditingController;
 final FormFieldValidator<String> validator;

 final String labelText;
 String dataText;

  @override
  _CustomTextFieldState createState() => new _CustomTextFieldState();
 }

 class _CustomTextFieldState extends State<CustomTextField> {
      @override
  Widget build(BuildContext context) {
    return Container(
        height: 65,
        child: new TextFormField(
            style: Utility.textFormFieldStyle(context),
        keyboardType: TextInputType.text,
        textInputAction: widget.nextFocusNode == null
            ? TextInputAction.done
            : TextInputAction.next,
        focusNode: widget.focusNode,
        onFieldSubmitted: (v) {
          FocusScope.of(context).requestFocus(widget.nextFocusNode);
        },
        decoration: InputDecoration(
            labelText: widget.labelText,
            contentPadding: Utility.edgeInsetsGeometry()),
        controller: widget.textEditingController,
        validator: widget.validator,
        onSaved: (String val) {


          widget.dataText = val;
          // not saving my value in my main class

          print("costom text view ${widget.dataText}");
        }));
    }
 }

  ///    main class ----- belo code is run from a stateful class   ----------------------///



List<FocusNode> listFocusNode;
 List<String> listDataText;
 List<TextEditingController> listTextEditingController;
 List<Widget> listFormField;

  @override
  void initState() {
   super.initState();

   listFocusNode = <FocusNode>[];
listTextEditingController = <TextEditingController>[];
listFormField = <Widget>[];
listDataText = <String>[];

for (int i = 0; i < 5; i++) {
  listFocusNode.add(FocusNode());
}

for (int i = 0; i < 5; i++) {
  listDataText.add("old");
}

for (int i = 0; i < 5; i++) {
  listTextEditingController.add(TextEditingController());
}

for (int i = 0; i < 5; i++)  {
  listFormField.add(CustomTextField(
    dataText: listDataText[i],
    focusNode: listFocusNode[i],
    labelText: "field$i",
    textEditingController: listTextEditingController[i],
    nextFocusNode: i == 4 ? null : listFocusNode[i + 1],
 //        validator: validateNull,
    validator: validateName,
     ));
   }
   }

  _validateForm() {
if (_key.currentState.validate()) {
  // No any error in validation
  _key.currentState.save();

  print("Name ${listDataText.toString()}");

  // when i print this data in log its printing old data only but onSaved should save value to the proper location in array list



  Navigator.of(context).pop();
} else {
  setState(() {
    _validate = true;
  });
}

}

【问题讨论】:

    标签: android dart flutter hybrid-mobile-app flutter-layout


    【解决方案1】:

    onSaved() 函数验证成功后不会自动调用。我们必须手动调用 _formKey.currentState.save() 来保存我们的变量。 祝你好运

    Form(
      key: key,
      child: TextFormField(
        onSaved: (val) {
          print('saved');
        },
        validator: (val) {
          print('validating');
        },
      ),
    ),
    RaisedButton(
      child: Text('Click me'),
      onPressed: () {
        if (key.currentState.validate()) {
          key.currentState.save();
          print('valid');
        }
      },
    ),
    

    【讨论】:

    • _validateForm() { if (_key.currentState.validate()) { // 验证没有任何错误 _key.currentState.save(); print("名称 ${listDataText.toString()}"); // 当我在日志中打印此数据时,它只打印旧数据,但 onSaved 应将值保存到数组列表中的正确位置 Navigator.of(context).pop(); } else { setState(() { _validate = true; }); } }
    • 我已经调用了 key.currentState.save();但它并没有保存我的价值观
    • Okey ,你可以使用这个 if (key.currentState.validate()) { key.currentState.save();值 = 控制器文本}
    • 你知道onFieldSubmitted什么时候被调用吗?
    • 当你点击右下角键盘上的提交时!!!当你将 InputTextAction 指定为 DONE !!
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2022-01-24
    • 2023-01-28
    相关资源
    最近更新 更多