Flutter中TextFormField的onSaved方法无法保存邮箱数据怎么办
问题产生原因
- 邮箱输入框的
onChanged回调存在两个核心问题:首先是判断分支逻辑写反,emailValidatorRegExp.hasMatch(value)的正则校验被放在else if分支,仅当输入内容为空时才会执行,空字符串不可能符合邮箱正则规则,该行判断永远不会触发;其次没有在onChanged中同步给email变量赋值,对比正常工作的密码输入框,密码的onChanged末尾主动执行了password = value同步变量,若你提交表单前未触发onSaved,自然读取不到邮箱的最新值。 onSaved回调本身有触发前提,需要你主动调用输入框所属Form组件的FormState.save()方法才会执行,如果你提交表单前没有调用该方法,onSaved里的邮箱赋值逻辑永远不会运行。- 你在
onChanged里打印email的时机不对,打印动作执行时还没有给email变量赋新值,输出的永远是旧值,也会造成你误以为onSaved未生效的错觉。
解决方法
- 修正邮箱输入框的
onChanged逻辑,补充email变量的同步赋值,调整判断分支顺序:
onChanged: (value) { if (value.isNotEmpty) { removeError(error: kEmailNullError); // 同步更新邮箱变量 email = value; } // 正则校验调整为输入内容变化时就判断,不需要放在else分支 if (emailValidatorRegExp.hasMatch(value)) { removeError(error: kInvalidEmailError); } return null; },
- 提交表单前必须调用Form的save方法,确保
onSaved逻辑触发,示例调用逻辑如下:
// 首先定义Form对应的全局key final _formKey = GlobalKey<FormState>(); // 提交按钮的点击逻辑中先校验、再执行save if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); // 此时再调用Firebase相关接口,传入email和password即可 }
- 可选优化:如果你的
addError方法没有内置setState逻辑,建议和密码输入框的validator一样,把addError操作包裹在setState中,保证错误提示的UI可以正常更新。
内容的提问来源于stack exchange,提问作者Ahmed Al-Khateeb
相关产品推荐
相关产品推荐

