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

Cloud Firestore API未启用致权限拒绝问题求助

解决Cloud Firestore PERMISSION_DENIED及API禁用问题

一、先确认Cloud Firestore API状态

  • 登录Google Cloud控制台,进入项目ID为416187152002的项目
  • 搜索「Cloud Firestore API」,查看右侧状态
  • 若显示「已禁用」,点击「启用」按钮,等待5-10分钟让配置生效

二、修正Firestore安全规则

权限拒绝大概率和规则配置有关,先排查规则是否过严:

注意:以下测试规则仅用于开发阶段,上线前必须根据业务需求严格限制权限

如果你的规则是类似这样的全拒绝配置:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

请临时修改为开发用规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /todos/{todo} {
      allow read: if true; // 允许读取todos集合数据
      allow write: if request.auth != null; // 写入需用户认证
    }
  }
}

修改后点击控制台的「发布」按钮生效。

三、代码层面排查要点

1. Firebase初始化验证

确保main函数中正确初始化Firebase,避免未初始化就调用Firestore:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

2. 仓库实现检查

确认集合路径和Firestore控制台中的名称完全一致(大小写敏感):

class TodoRepository {
  final CollectionReference _todosCollection = FirebaseFirestore.instance.collection('todos');

  Stream<List<Todo>> getTodos() {
    return _todosCollection.snapshots().map((snapshot) {
      return snapshot.docs.map((doc) => Todo.fromMap(doc.data() as Map<String, dynamic>, doc.id)).toList();
    });
  }
}

同时检查Todo.fromMap方法是否正确解析文档字段,避免因字段不匹配导致隐性错误。

3. 组件数据流监听

确保HomeBody中正确处理Stream的错误状态,方便定位问题:

class HomeBody extends StatelessWidget {
  final TodoRepository repository = TodoRepository();

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<Todo>>(
      stream: repository.getTodos(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Center(child: Text('错误详情: ${snapshot.error}'));
        }
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        }
        final todos = snapshot.data ?? [];
        return ListView.builder(
          itemCount: todos.length,
          itemBuilder: (context, index) {
            final todo = todos[index];
            return ListTile(title: Text(todo.title));
          },
        );
      },
    );
  }
}

四、其他收尾排查

  • 执行flutter clean清除项目缓存后重新运行,避免依赖缓存问题
  • 检查pubspec.yaml中firebase_core和cloud_firestore的版本是否兼容,建议使用官方推荐的配套版本
  • 确认设备/模拟器网络正常,Firestore请求需要稳定的网络连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:15:35