Flutter表单验证时validate方法与TextFormField validator报空检查错误
Flutter表单空安全报错修复方案
报错1:_formKey.currentState.validate()空检查报错
无法无条件调用方法'validate',因为接收方可能为'null'。
原因
GlobalKey<FormState>.currentState仅在关联的Form组件完成挂载后才有值,未挂载场景下为null,空安全规则禁止直接调用可能为null对象的方法。
修复方案
使用空安全调用符?.配合空合并运算符??处理null场景,currentState为null时默认返回false,不进入校验通过逻辑:
moveToHome(BuildContext context) async{ if(_formKey.currentState?.validate() ?? false) { setState(() { onLog = true; }); await Future.delayed(Duration(milliseconds: 700)); Navigator.pushNamed(context, MyRoutes.homeRoute); setState(() { onLog = false; }); } }
报错2:TextFormField的validator中调用isEmpty空检查报错
原因
validator回调的入参类型为String?,表单重置等场景下value可能为null,无法直接调用isEmpty方法。
修复方案
使用空安全调用符判空,空值场景下默认判定为校验不通过,同时补充onChanged回调的空兼容处理,避免uid被赋值为null:
TextFormField( decoration: const InputDecoration( hintText: 'Enter username', labelText: 'Username', ), onChanged: (value) { uid = value ?? ""; setState(() {}); }, validator: (value) => (value?.isEmpty ?? true) ? 'Email cannot be empty' : null, )
额外逻辑修复
密码输入框的validator逻辑存在规则错误:表单校验通过时必须返回null,返回字符串会被识别为校验失败,修复后逻辑如下:
validator: (value) { if(value == null || value.isEmpty){ return 'Please enter password!'; }else if(value.length <6){ return 'password must be at least 6 characters'; } return null; }
内容的提问来源于stack exchange,提问作者Shaffaan Laughs at u
相关产品推荐
相关产品推荐

