You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
      }
    });
  });
}

额外优化建议

  1. 避免全量查询admins集合,改用where条件过滤匹配的管理员ID,减少数据传输量、提升查询效率:
FirebaseFirestore.instance.collection('admins').where('id', isEqualTo: _adminController.text.trim()).get()
  1. 不要在Firestore中明文存储管理员密码,建议存储加盐哈希后的密码,登录时将用户输入的密码做相同哈希处理后再比对。
  2. 访问文档字段前可先做存在性校验,或使用get方法设置默认值,避免字段不存在时抛异常:
String pwd = result.get('password') ?? '';

内容的提问来源于stack exchange,提问作者M Nouman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:45:00