Flutter Firestore报错:DocumentReference无where方法
问题解决:Firestore调用where报错"The method 'where' isn't defined for the type 'DocumentReference'"
错误原因
你调用.doc(id)后得到的是DocumentReference对象,它指向Firestore中的单个具体文档,这类对象没有where方法——where是CollectionReference(集合引用)的专属方法,用于筛选集合内的多个文档。你的代码逻辑混淆了「单个文档获取」和「集合条件查询」的层级。
解决方案(分两种场景)
场景1:想查询集合中符合「指定文档ID + 难度条件」的文档
直接在集合层面构建查询,同时加入文档ID的筛选条件:
chamaBancoDeDados(curso, materia, id, dificuldade) async { Map<String, dynamic> dados = {}; final queryRef = FirebaseFirestore.instance .collection('cursos') .doc(curso) .collection(materia) // 筛选文档ID等于指定值 .where(FieldPath.documentId, isEqualTo: id) // 同时筛选dificuldade数组包含'normal' .where('dificuldade', arrayContainsAny: ['normal']); final querySnapshot = await queryRef.get(); if (querySnapshot.docs.isNotEmpty) { try { dados = querySnapshot.docs.first.data() as Map<String, dynamic>; print("dados são: $dados"); } on StateError catch (e) { print('Erro tentando adquirir o documento no banco de dados: $e'); } } else { print('O documento não existe ou não atende à condição de dificuldade'); } return dados; }
场景2:先获取指定ID的文档,再判断其难度是否符合要求
如果目标是获取指定ID的文档,仅在本地验证字段条件:
chamaBancoDeDados(curso, materia, id, dificuldade) async { Map<String, dynamic> dados = {}; final documentoRef = FirebaseFirestore.instance .collection('cursos') .doc(curso) .collection(materia) .doc(id); final documento = await documentoRef.get(); if (documento.exists) { try { dados = documento.data() as Map<String, dynamic>; // 本地验证dificuldade条件 final dificuldades = dados['dificuldade'] as List?; if (dificuldades == null || !dificuldades.contains('normal')) { dados = {}; print('O documento existe mas não atende à condição de dificuldade'); } else { print("dados são: $dados"); } } on StateError catch (e) { print('Erro tentando adquirir o documento no banco de dados: $e'); } } else { print('O documento não existe no banco de dados'); } return dados; }
额外注意点
原代码使用then异步回调但直接返回dados,会导致返回的是空Map(因为异步操作还未完成),所以改成async/await确保数据获取完成后再返回。
内容的提问来源于stack exchange,提问作者Luiz Sanches
相关产品推荐
相关产品推荐

