Flutter 使用嵌套自定义表单字段保存执行订单上的颤振表单

Flutter 使用嵌套自定义表单字段保存执行订单上的颤振表单,flutter,dart,Flutter,Dart,我有一个自定义的FormField MyFancyTextFormField,它只是用一些额外的东西包装了一个TextFormField 我想单独使用这个FormField,但我也想在另一个FormField中使用它:TextList基本上只是一个填充了MyFancyTextFormFields的列 我想到了这个: class FirstWidget扩展了StatefulWidget{ @凌驾 State createState()=>FirstWidgetState(); } 类FirstWi

我有一个自定义的FormField MyFancyTextFormField,它只是用一些额外的东西包装了一个TextFormField

我想单独使用这个FormField,但我也想在另一个FormField中使用它:TextList基本上只是一个填充了MyFancyTextFormFields的列

我想到了这个:

class FirstWidget扩展了StatefulWidget{
@凌驾
State createState()=>FirstWidgetState();
}
类FirstWidgetState扩展了状态{
GlobalKey _form=GlobalKey();
列表首字母=['1','2','3'];
修改列表;
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
形式(
键:_形式,
child:TextList(initialValue:initial,onSaved:(values)=>print('TextList保存时使用:${modified=values}'),
),
升起的按钮(
子项:文本('Save'),
已按下:(){
_form.currentState.save();
打印('初始值为:$Initial,修改后的值为:$modified');
},
)
],
),
);
}
}
类TextList扩展了FormField{
TextList({List initialValue,FormFieldSetter onSaved})
:超级(
initialValue:initialValue,
已保存:已保存,
建筑商:(州){
//复印
List _value=List.of(state.value);
//这只是创建MyFancyTextFormField的列表
列表字段=\u值
.asMap()
.map((i,val)=>MapEntry(
我
MyFancyTextFormField(
初始值:_值[i],
保存:(val){
打印('MyFancyTextFormField[$i]与$val一起保存');
state.didChange(_value..replaceRange(i,i+1,[val]));
})))
价值观
.toList();
返回列(
孩子们:田野,
);
});
}
类MyFancyTextFormField扩展了FormField{
MyFancyTextFormField({
字符串初始值,
FormFieldSetter已被保存,
}):超级(
initialValue:initialValue,
onSaved:(值)=>onSaved(值),
生成器:(state)=>TextFormField(
initialValue:initialValue,
已保存:已保存,
));
}
问题是,当我保存()表单状态时,框架将首先保存我的顶级FormField TextList,然后再保存我的叶级FormField MyFancyTextFormField

这是我的输出:

I/flutter (  615): TextList saved with: [one, two, three]
I/flutter (  615): MyFancyTextFormField[0] saved with one
I/flutter (  615): MyFancyTextFormField[0] saved with oneee
I/flutter (  615): MyFancyTextFormField[1] saved with two
I/flutter (  615): MyFancyTextFormField[1] saved with two
I/flutter (  615): MyFancyTextFormField[2] saved with three
I/flutter (  615): MyFancyTextFormField[2] saved with threeeeeeeeee
I/flutter (  615): Initial value was: [one, two, three], modified value is: [one, two, three]
由于在第一次执行save()之后,我的文本列表的状态已正确更新,因此如果再次运行save(),我将获得预期的输出:

I/flutter (  615): TextList saved with: [oneee, two, threeeeeeeeee]
I/flutter (  615): MyFancyTextFormField[0] saved with one
I/flutter (  615): MyFancyTextFormField[0] saved with oneee
I/flutter (  615): MyFancyTextFormField[1] saved with two
I/flutter (  615): MyFancyTextFormField[1] saved with two
I/flutter (  615): MyFancyTextFormField[2] saved with three
I/flutter (  615): MyFancyTextFormField[2] saved with threeeeeeeeee
I/flutter (  615): Initial value was: [one, two, three], modified value is: [oneee, two, threeeeeeeeee]
为什么MyFancyTextFormField的onSaved调用了两次

有没有一种方法比调用state.save()更好地获得我的预期结果,其次数是我的FormField树高度的两倍


提前谢谢。

回答得很晚,但我认为这是因为
MyFancyTextFormField
扩展了
FormField
,并在生成器中返回了一个额外的
TextFormField
。如果将
MyFancyTextFormField
转换为一个无状态小部件,返回一个
TextFormField
,您将得到您想要的:

class MyFancyTextFormField extends StatelessWidget {
  final String initialValue;
  final FormFieldSetter<String> onSaved; 

   MyFancyTextFormField({
    this.initialValue,
    this.onSaved,  
  }) ;

  @override
  Widget build(BuildContext context) {
    return TextFormField(
        initialValue: initialValue,
        onSaved: this.onSaved);
  }
}
类MyFancyTextFormField扩展了无状态小部件{
最终字符串初始值;
保存最终表单设置器;
MyFancyTextFormField({
这个初始值,
这是我的储蓄,
}) ;
@凌驾
小部件构建(构建上下文){
返回TextFormField(
initialValue:initialValue,
onSaved:这个。onSaved);
}
}

谢谢。再看一次我无法解决的问题总是很有用的。这实际上是一个很好的观点。我不记得我是否有任何特殊的原因,为什么
MyFancyTextFormField
应该扩展
FormField
(如果有任何合理的原因)。我会再看一遍我的代码。