Android 颤振:自定义TextFormField未保存保存的值

Android 颤振:自定义TextFormField未保存保存的值,android,dart,flutter,hybrid-mobile-app,flutter-layout,Android,Dart,Flutter,Hybrid Mobile App,Flutter Layout,onSaved不是在我调用该类的主类中保存我的值 我想根据api返回数据生成定制表单,并将数据绑定到表单中,然后它应该按照在Flatter中调用的validate进行验证 我已经为生成表单字段创建了自定义textform字段 在主类中,我使用listview和for循环生成一个列表,然后我的表单将进行验证 class CustomTextField extends StatefulWidget { CustomTextField( {@required this.focusNode, @

onSaved不是在我调用该类的主类中保存我的值

我想根据api返回数据生成定制表单,并将数据绑定到表单中,然后它应该按照在Flatter中调用的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;
  });
}
class CustomTextField扩展StatefulWidget{
自定义文本字段(
{@required this.focusNode,
@需要此.nextFocusNode,
@需要此.textEditingController,
@需要此验证程序,
@需要此.labelText,
@需要此.dataText});
最终焦点节点焦点节点;
最终焦点节点下一焦点节点;
最终文本编辑控制器文本编辑控制器;
最终FormFieldValidator验证程序;
最终字符串标签文本;
字符串数据文本;
@凌驾
_CustomTextFieldState createState()=>new_CustomTextFieldState();
}
类_CustomTextFieldState扩展状态{
@凌驾
小部件构建(构建上下文){
返回容器(
身高:65,
子项:新建TextFormField(
样式:Utility.textFormFieldStyle(上下文),
键盘类型:TextInputType.text,
textInputAction:widget.nextFocusNode==null
?TextInputAction.done
:TextInputAction.next,
focusNode:widget.focusNode,
提交的文件:(五){
FocusScope.of(context).requestFocus(widget.nextFocusNode);
},
装饰:输入装饰(
labelText:widget.labelText,
contentPadding:Utility.EdgeInSetGeometry()),
控制器:widget.textEditingController,
验证程序:widget.validator,
onSaved:(字符串val){
widget.dataText=val;
//在我的主课堂上没有保存我的价值
打印(“costom文本视图${widget.dataText}”);
}));
}
}
///main类------belo代码从有状态类运行----------------------///
列出listFocusNode;
列表数据文本;
列表文本编辑控制器;
列表表单字段;
@凌驾
void initState(){
super.initState();
listFocusNode=[];
listTextEditingController=[];
listFormField=[];
listDataText=[];
对于(int i=0;i<5;i++){
添加(FocusNode());
}
对于(int i=0;i<5;i++){
添加(“旧”);
}
对于(int i=0;i<5;i++){
添加(TextEditingController());
}
对于(int i=0;i<5;i++){
添加(CustomTextField(
dataText:listDataText[i],
focusNode:listFocusNode[i],
labelText:“字段$i”,
textEditingController:listTextEditingController[i],
nextFocusNode:i==4?null:listFocusNode[i+1],
//验证程序:validateNull,
验证程序:validateName,
));
}
}
_validateForm(){
if(_key.currentState.validate()){
//验证中没有任何错误
_key.currentState.save();
打印(“Name${listDataText.toString()}”);
//当我在日志中打印此数据时,其仅打印旧数据但已保存应将值保存到数组列表中的正确位置
Navigator.of(context.pop();
}否则{
设置状态(){
_验证=真;
});
}
}验证成功后,不会自动调用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()){//validation中没有任何错误_key.currentState.save();打印(“Name${listDataText.toString()}”);//当我在日志中打印此数据时,仅打印旧数据,但保存的数据应将值保存到数组列表导航器中的正确位置。of(context).pop()}else{setState((){u validate=true;});}}我已经调用了key.currentState.save();但是它没有保存我的值。如果(key.currentState.validate()){key.currentState.save();value=controller.text}您知道什么时候调用onfeldsubmitted吗?当您在右下角的键盘上单击submit时!!!当您指定InputExtAction完成时!!