Flutter新手求助:Validator未将数据保存至Firebase数据库
解决Flutter表单数据无法保存至Firebase的问题
嘿,我一眼就瞅出问题出在哪了——你的表单验证逻辑写反啦!
问题根源
你的TextFormField的validator函数不管输入值是否为空,都会返回错误提示文本。在Flutter的表单机制里,只要validator返回非null的值,就会被判定为验证不通过,这时候onSaved方法根本不会被调用!所以你的offerName这些变量始终是初始的null,写入Firebase自然就是null了。
修复步骤
1. 修正单个字段的验证逻辑
把validator改成只有当值为空时才返回错误,否则返回null(表示验证通过):
TextFormField( decoration: InputDecoration(hintText: 'Enter Offer Name'), validator: (value) { // 仅当值为空/未输入时返回错误提示 if (value == null || value.isEmpty) { return 'Please Enter Offer Name'; } // 验证通过时必须返回null return null; }, onSaved: (value) => offerName = value, )
注意:其他字段(比如offerType、start、end)的validator也要按照这个逻辑修改,不然同样会出现值无法保存的问题。
2. 用Form组件+GlobalKey管理表单状态
你需要把所有表单字段放在Form组件里,并用GlobalKey<FormState>来控制表单的验证和保存流程:
首先定义全局key:
final _formKey = GlobalKey<FormState>();
然后包裹表单并修改按钮逻辑:
Form( key: _formKey, child: Column( children: [ // 这里放你的所有TextFormField(offerName、offerType等) TextFormField(...), // 你的确认按钮 FlatButton( color: Colors.blue, child: Text("Confirm", style: TextStyle(color: Colors.white)), onPressed: () async { // 第一步:验证所有表单字段 if (_formKey.currentState!.validate()) { // 第二步:验证通过后,触发所有字段的onSaved,保存输入值到变量 _formKey.currentState!.save(); // 第三步:现在变量有值了,再写入Firebase await db.collection("createdoffers").add({ 'name': offerName, 'type': offerType, 'start': start, 'end': end, }); } }, ), ], ), )
为什么这样改?
_formKey.currentState!.validate()会遍历所有表单字段的validator,只有全部返回null(都验证通过)才会进入if块_formKey.currentState!.save()会调用每个字段的onSaved方法,把用户输入的值赋值给你定义的变量(比如offerName)- 这时候再调用Firebase的
add方法,变量就已经持有正确的输入值了,不会再是null啦!
内容的提问来源于stack exchange,提问作者KDC
相关产品推荐
相关产品推荐

