使用geoflutterfire2获取中心距离时提示字段不存在,该如何解决?
问题分析与解决
首先明确:distance 不是Firestore文档本身存储的字段,是geoflutterfire2执行地理查询时动态生成的临时字段,它的存储位置决定了你的访问方式是否有效。
1. 两种访问方式的核心差异
在Flutter的Firebase SDK中,DocumentSnapshot的字段访问逻辑有区别:
document.data()(旧版本SDK可能是document.data属性):返回的是包含geoflutterfire2附加字段的查询结果对象,distance就包含在这里面。document['fieldName']:直接访问Firestore文档本身存储的字段,而distance并非你存在数据库里的字段,所以会触发field "distance" does not exist错误。
2. 正确获取distance的必要步骤
第一步:查询时必须开启includeDistance
构建地理查询时,必须调用includeDistance()参数,否则geoflutterfire2不会生成并返回distance字段:
final geo = GeoFlutterFire(); final collectionRef = FirebaseFirestore.instance.collection('你的集合名'); // 构建带距离计算的地理查询 final query = geo.collection(collectionRef: collectionRef) .within( center: GeoPoint(30.0, 120.0), // 查询中心坐标 radius: 5.0, // 查询半径(单位:千米) field: 'position', // 你文档中存储地理坐标的字段名 includeDistance: true // 必须开启此参数才能获取distance );
第二步:从查询结果的data对象中读取distance
根据你使用的Firebase SDK版本,选择对应的访问方式:
- 新版本SDK(推荐):
documentList.forEach((DocumentSnapshot document) { // 获取文档本身存储的位置 GeoPoint pos = document.data()!['position']['geopoint']; // 获取geoflutterfire生成的距离 double distance = document.data()!['distance']; });
- 旧版本SDK(对应教程中的写法):
documentList.forEach((DocumentSnapshot document) { GeoPoint pos = document.data['position']['geopoint']; double distance = document.data['distance']; });
3. 教程写法生效的原因
Jeff Delaney的教程使用的是旧版Firebase SDK,当时DocumentSnapshot的data是一个属性而非方法,因此document.data['distance']可以正常访问到临时生成的距离字段。你当前使用的SDK版本已更新,需改用document.data()方法获取包含附加字段的结果对象。
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

