Flutter 颤振长形不';t保存所有FormTextField值
通过使用ListView.builder生成TextFormFields,我构建了一个相当长的表单。 如果我只生成了几个TextFormFields,事情似乎很顺利,但是当我有很多TextFormFields时,当我单击底部的save按钮时,似乎只保存了其中的一部分 我想知道我是否需要实现async/Wait或其他什么 就功能而言,表单是相当标准的。我正在引用,但没有单独列出每个TextFormField,我只有一个小部件函数,并以这种方式构建一个ListView 下面是我的代码(注意:实际上大约有20个变量,我在下面的代码中只列出了5个。另外,这是在一个有状态的小部件中):Flutter 颤振长形不';t保存所有FormTextField值,flutter,flutter-form-builder,Flutter,Flutter Form Builder,通过使用ListView.builder生成TextFormFields,我构建了一个相当长的表单。 如果我只生成了几个TextFormFields,事情似乎很顺利,但是当我有很多TextFormFields时,当我单击底部的save按钮时,似乎只保存了其中的一部分 我想知道我是否需要实现async/Wait或其他什么 就功能而言,表单是相当标准的。我正在引用,但没有单独列出每个TextFormField,我只有一个小部件函数,并以这种方式构建一个ListView 下面是我的代码(注意:实际上大
final_formKey=GlobalKey();
字符串var1=“”;
字符串var2=“”;
字符串var3=“”;
字符串var4=“”;
字符串var5=“”;
列表_varListNames=[
“var1”,
“var2”,
“var3”,
“var4”,
“var5”
];
Map myMap={};
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:表格(
键:_formKey,
子项:ListView.builder(
itemCount:_varListNames.length+1,
itemBuilder:(上下文,索引){
返回索引==\u varListNames.length
?buildSubmit()
:experimentParameterWidget(
paramMapKey:_varListNames[索引],
paramMap:myMap,
);//文本(expParamKeys[索引])
}),
),
);
}
小部件myWidget({必需的字符串myKey,必需的myMap})=>TextFormField(
装饰:输入装饰(
labelText:myKey,
边框:OutlineInputBorder(),
),
验证器:(值){
如果(值!.length<2){
返回“输入至少2个字符”;
}
},
已保存:(值){
打印(“将$myKey保存为$value”);
设置状态(){
myMap[myKey]=值;
});
},
);
小部件buildSubmit()=>填充(
填充:常数边集全部(16.0),
子:列(
儿童:[
升降按钮(
已按下:(){
设置状态(){
final isValid=\u formKey.currentState!.validate();
如果(有效){
打印(“有效”);
_formKey.currentState!.save();
最终消息=expParams;
最终蛇杆=蛇杆(
内容:文本(
json.encode(消息),
样式:TextStyle(字体大小:20),
),
背景颜色:Colors.green,
);
ScaffoldMessenger.of(上下文)。showSnackBar(snackBar);
}
});
打印('myMap:$myMap');
打印('expParams length:${myMap.length}');
},
子项:文本(“保存”),
填充物(
填充:常量边集。对称(垂直:24),
子项:提升按钮(按下时:(){},子项:文本(“运行”),
),
],
),
);
这导致底部有一个小snackbar,其中显示了myMap的一些键值对,而终端中的print语句显示了更多的键值对(不是相同的)
我需要一份完整的清单
最终目标是在另一个选项卡上显示myMap键/值对
如果你需要更多的澄清,让我知道
谢谢你的帮助
final _formKey = GlobalKey<FormState>();
String var1 = "";
String var2 = "";
String var3 = "";
String var4 = "";
String var5 = "";
List<String> _varListNames = [
'var1',
'var2',
'var3',
'var4',
'var5'
];
Map myMap = {};
@override
Widget build(BuildContext context) {
return SafeArea(
child: Form(
key: _formKey,
child: ListView.builder(
itemCount: _varListNames.length + 1,
itemBuilder: (context, index) {
return index == _varListNames.length
? buildSubmit()
: experimentParameterWidget(
paramMapKey: _varListNames[index],
paramMap: myMap,
); // Text(expParamKeys[index])
}),
),
);
}
Widget myWidget({required String myKey, required myMap}) => TextFormField(
decoration: InputDecoration(
labelText: myKey,
border: OutlineInputBorder(),
),
validator: (value) {
if (value!.length < 2) {
return 'Enter at least 2 characters';
}
},
onSaved: (value) {
print("SAVING $myKey as $value");
setState(() {
myMap[myKey] = value;
});
},
);
Widget buildSubmit() => Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
ElevatedButton(
onPressed: () {
setState(() {
final isValid = _formKey.currentState!.validate();
if (isValid) {
print("IS VALID");
_formKey.currentState!.save();
final message = expParams;
final snackBar = SnackBar(
content: Text(
json.encode(message),
style: TextStyle(fontSize: 20),
),
backgroundColor: Colors.green,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
});
print('myMap: $myMap');
print('expParams length: ${myMap.length}');
},
child: Text("Save")),
Padding(
padding: const EdgeInsets.symmetric(vertical: 24),
child: ElevatedButton(onPressed: () {}, child: Text("Run")),
),
],
),
);