Flutter Firestore管理员登录报错:字段不存在但Firestore实际存在该字段
解决方案
错误根因
你的报错完全是代码语法书写错误导致的,和Firestore控制台创建的字段无关:
原loginAdmin方法中密码校验的行括号位置写错,把布尔判断逻辑写进了字段名的方括号内:
// 错误写法 else if(result['password' != _passwordController.text.trim()])
上述代码中方括号内的'password' != _passwordController.text.trim()是布尔表达式,运行后会返回true/false,相当于你尝试从文档快照中读取key为true或者false的字段,Firestore中自然不存在该字段,因此抛出field does not exist异常。
修复代码
将该行的括号位置调整即可,完整修复后的loginAdmin方法如下:
loginAdmin (){ FirebaseFirestore.instance.collection('admins').get().then((snapshot){ snapshot.docs.forEach((result){ if(result['id'] != _adminController.text.trim()) { Scaffold.of(context).showSnackBar(SnackBar(content: Text('ID is not Correct'))); } // 仅修改这一行的括号位置即可 else if(result['password'] != _passwordController.text.trim()) { Scaffold.of(context).showSnackBar(SnackBar(content: Text('Password is not Correct'))); } else { Scaffold.of(context).showSnackBar(SnackBar(content: Text('Welcome Admin, ' +result['name'],))); setState(() { _adminController.text=''; _passwordController.text=''; }); Route route=MaterialPageRoute(builder: (c)=> UploadPage()); Navigator.pushReplacement(context, route); } }); }); }
额外优化建议
- 避免全量查询
admins集合,改用where条件过滤匹配的管理员ID,减少数据传输量、提升查询效率:
FirebaseFirestore.instance.collection('admins').where('id', isEqualTo: _adminController.text.trim()).get()
- 不要在Firestore中明文存储管理员密码,建议存储加盐哈希后的密码,登录时将用户输入的密码做相同哈希处理后再比对。
- 访问文档字段前可先做存在性校验,或使用
get方法设置默认值,避免字段不存在时抛异常:
String pwd = result.get('password') ?? '';
内容的提问来源于stack exchange,提问作者M Nouman
相关产品推荐
相关产品推荐

