Flutter/Dart从Firestore拉取数据返回Null的问题排查求助
Flutter从Firestore拉取文档字符串返回Null问题排查
使用Flutter/Dart从Firestore数据库拉取文档字符串时始终返回Null,代码及报错信息如下:
String getDoc(String group, String channel, String message) { var data; final docRef = db.collection('Groups').doc('$group').collection('Channel').doc('$channel').collection('Messages').doc('$message'); docRef.get().then( (DocumentSnapshot doc) { data = doc.data() as Map<String, dynamic>; }, onError: (e) => print("Error getting document: $e"), ); print(data); var returnMessage = data?['messageBody']; print(returnMessage); return returnMessage; }
报错信息(翻译后):
======== 手势处理时捕获异常 ===============================================================
处理手势时抛出以下TypeErrorImpl:
期望类型为'String',但实际得到类型为'Null'的内容
问题原因与修复方案
核心问题:异步操作执行顺序错误
docRef.get()是异步方法,then中的回调需要等待Firestore返回数据后才会执行,但你的代码在调用异步方法后立刻就读取data并返回,此时data还未被赋值,必然是Null。修复代码(改为异步方法并使用await)
Future<String> getDoc(String group, String channel, String message) async { try { final docRef = db.collection('Groups').doc(group) .collection('Channel').doc(channel) .collection('Messages').doc(message); final DocumentSnapshot doc = await docRef.get(); if (doc.exists) { final data = doc.data() as Map<String, dynamic>; // 处理字段可能为空的情况,返回默认值避免Null return data['messageBody'] as String? ?? '无内容'; } else { return '目标文档不存在'; } } catch (e) { print("获取文档错误: $e"); return '获取数据失败'; } }
- 调用注意事项
调用该方法时需使用await等待结果,例如在手势回调中:// 示例调用 String result = await getDoc('testGroup', 'testChannel', 'testMessage');
内容的提问来源于stack exchange,提问作者Jacob Myers
相关产品推荐
相关产品推荐

