簡體   English   中英

Flutter:自定義TextFormField不保存onSaved值

[英]Flutter : Custom TextFormField is not saving values onSaved

onSaved沒有在我調用這個類的主類中保存我的值

我想根據api返回數據生成自定義表單並綁定表單中的數據,然后它應該在flutter中驗證為validate on validate

我已經創建了自定義textform字段來生成表單字段

從主類我使用listview與for循環生成一個列表,然后我的表單將驗證

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;
  });
}

}

成功驗證后,不會自動調用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');
    }
  },
),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM