Firestore的GeoFlutterFire Flutter插件无法返回距离字段

时间:2020-04-14 19:52:51

标签: flutter google-cloud-firestore geofire

我正在使用GeoFlutterFire,这是Flutter的插件,它可以过滤集合中指定的GeoFirePoint附近的记录。
距离键应该与Firestore <DocumentSnapshot>s一起返回,但没有,只有默认键。当我如下查找时,它返回null。密钥不存在。

  1. 我尝试过更改模拟器的GPS位置,然后 usersAddressGeoFirePoint,不走运。
  2. 有关GeoFire是创建此字段还是需要将其预先存储为Firestore字段的说明不清楚。我尝试手动使用虚拟值创建Firestore字段,然后从下载中获得的值不是2个地理点之间的距离,而是在Firestore上设置的虚拟值。

这是一个很大的挫败感,我需要一定的距离,以便可以在应用程序的Cards上显示它,我的代码与该插件的示例代码非常接近,因此我看不到为什么它不起作用。

GeoFirePoint usersAddressGeoFirePoint = geo.point(latitude: 56.088944, longitude: -4.151800);

    localJobsStream = geo.collection(collectionRef: myFirestore.collection('JobsMeta'))
        .within(center: usersAddressGeoFirePoint, radius: 1000, field: 'position', strictMode: true);

    localJobsStream.listen((List<DocumentSnapshot> documentList) {
${documentList[0].data.keys.contains('distance')}");
}

2 个答案:

答案 0 :(得分:5)

我检查了Geoflutterfire的(中心:中心,半径:半径,字段:字段,strictMode:strictMode)内方法,并按预期返回了Stream<List<DocumentSnapshot>>,但为了进行距离计算,它正在使用包装类 DistanceDocSnapshot ,该类具有DocumentSnapshot和distance变量。

当我调试“内部” 方法时,我发现DistanceDocSnapshot的变量 distance 的类型为double,但是他们没有在 DocumentSnapshot中设置距离值,然后返回。

因此,程序包中有数据,但是直到我们得到它为止才有用。在他们解决此问题或我们了解使用它的其他方式时,您可以使用以下代码来获取距离,因为他们在软件包中使用的距离与自述文件here GeoFlutterFire Package中提到的一样:

 GeoFirePoint center = geo.point(
     latitude: currentUserPos.latitude,
     longitude: currentUserPos.longitude,
 );

 double distance = center.distance(lat: geoPoint.latitude, lng: geoPoint.longitude);

更新相同: 根据软件包页面上的更改日志,我们将无法通过版本2.1.0

使用doc.data ['distance']访问数据

答案 1 :(得分:0)

geoflutterfire返回距离

获取用户位置

    ID  Item    Valid_From  Valid_To    Overlap By
    1   i_1     2007-01-01  2030-01-01  X Days
    1   i_2     2007-01-01  2030-01-01  X Days

将用户位置转换为GeoPoint

from django.template import Template, Context

template = Template('Hello {{name}}.')
context = Context(dict(name='World'))
rendered: str = template.render(context)

从您的DocumentSnapshot List数据中获取

将列表数据转换为经时长

Geolocator userLocation = Geolocator()

使用经纬度来获取距离

point.distance(纬度,经度)

GeoFirePoint point = geo.point(latitude: userLocation.latitude, longitude: userLocation.longitude);