Flutter开发中无法从Firebase Firestore拉取quotes集合数据
Flutter Firestore quotes集合数据拉取失败问题解决
问题描述
- Firestore数据库
quotes集合内已存储4条语录数据 - 执行查询逻辑时始终无法获取到对应数据
- 关联
quotesPage的quotesController中fetchQuotes方法实现如下:
fetchQuotes(String catId) { print(catId); try { quotesList.bindStream(firebaseFirestore .collection('quotes') .where( 'category', isEqualTo: "General", ) .snapshots() .map((QuerySnapshot query) { List<Quotes> quotes = []; for (var quote in query.docs) { final quoteModel = Quotes.fromDocumentSnapshot(documentSnapshot: quote); quotes.add(quoteModel); } return quotes; })); } on Exception catch (e) { print(e); } }
排查修复步骤
按以下优先级逐一核对即可定位问题:
Firestore安全规则拦截
这是新手最高发的问题,Firebase默认生成的安全规则要求所有读写请求必须携带合法登录态,未登录状态下的请求会被后端直接拦截,且这类错误不会被你写在外层的try catch捕获。临时测试可先调整规则放开quotes集合读权限:rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /quotes/{document=**} { allow read: if true; allow write: if request.auth != null; } } }生产环境请勿长期放开全量读权限,需结合自身鉴权逻辑配置对应规则
查询条件匹配失败
Firestore查询是大小写严格匹配的,逐一核对集合内4条数据:- 确认每条数据都存在
category字段,没有拼写错误(比如误存为cat、categoryId都无法匹配) - 确认
category字段类型为字符串,值严格等于General,存在大小写差异、前后多余空格、类型不匹配(比如存成数组、数字)都会导致查询结果为空
- 确认每条数据都存在
流内部错误未捕获
你当前的try catch只能捕获同步执行的代码错误,snapshots()流内部抛出的异步错误、map中数据解析的错误都无法被捕获,会导致流静默终止。先给流加错误监听,同时打印查询返回的文档数量定位问题层级:quotesList.bindStream(firebaseFirestore .collection('quotes') .where('category', isEqualTo: "General") .snapshots() .map((QuerySnapshot query) { // 先打印长度确认查询是否拿到数据 print("查询返回文档数量:${query.docs.length}"); List<Quotes> quotes = []; for (var quote in query.docs) { final quoteModel = Quotes.fromDocumentSnapshot(documentSnapshot: quote); quotes.add(quoteModel); } return quotes; }) .handleError((err) { // 这里会打印流内部的所有错误,包括权限错误、解析错误 print("流错误:$err"); }) );如果打印的文档数量是4但页面无数据,直接检查
Quotes.fromDocumentSnapshot方法内的字段映射,大概率是字段名和Firestore存储的字段不匹配、类型转换报错导致模型生成失败。Firebase初始化配置错误
确认Android端放入的google-services.json、iOS端放入的GoogleService-Info.plist是当前存储数据的Firebase项目对应的配置文件,配置文件不匹配会导致App连到空的Firebase项目,自然查不到数据。
内容的提问来源于stack exchange,提问作者Syed Ali Sultan Bukhari
相关产品推荐
相关产品推荐

