Плагин GeoFlutterFire Flutter для Firestore не возвращает поле расстояния

Я использую GeoFlutterFire, плагин для Flutter, который отсеивает коллекцию для записей, которые находятся рядом с указанной точкой GeoFirePoint. .
Ключ расстояния должен возвращаться с Firestore <DocumentSnapshot>s, но его нет, только ключи по умолчанию. Когда я ищу его, как показано ниже, он возвращает null. Ключ не существует.

  1. Я пробовал изменить местоположение GPS эмуляторов, а затем usersAddressGeoFirePoint, не повезло.
  2. В инструкциях неясно, создает ли GeoFire это поле или ему нужно, чтобы оно существовало заранее как поле Firestore. Я попытался создать поле Firestore вручную с фиктивным значением, и тогда значение, которое я получаю из загрузки, - это не расстояние между двумя geopoint точками, а фиктивное значение, которое оно было установлено в Firestore.

Это большое разочарование, мне нужно расстояние, чтобы я мог показать его на карточках в приложении, мой код очень близок к примеру кода для плагина, поэтому я не понимаю, почему он не работает.

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')}");
    }

person Sam    schedule 14.04.2020    source источник


Ответы (2)


Я проверил метод Geoflutterfire в пределах (center: center, radius: radius, field: field, strictMode: strictMode), и он возвращает Stream<List<DocumentSnapshot>>, как и ожидалось, но для расчета расстояния он использует класс-оболочку DistanceDocSnapshot, который имеет DocumentSnapshot и переменную расстояния.

Когда я отлаживал метод внутри, я обнаружил, что DistanceDocSnapshot имеет переменную расстояние типа double, но они не устанавливают значение расстояния в DocumentSnapshot раньше возвращение.

Итак, в пакете есть данные, но они бесполезны, пока мы их не получим. К тому времени, когда они исправят эту проблему или мы узнаем какой-либо другой способ ее использования, вы можете использовать приведенный ниже код, чтобы получить расстояние, поскольку они используют то же самое в пакете и упоминаются в readme здесь GeoFlutterFire Package:

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

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

Обновление того же: согласно журналу изменений на странице пакета мы больше не сможем получить доступ к данным с помощью doc.data ['distance'] с версией 2.1.0

person Arpit    schedule 18.04.2020
comment
эй, как бы передать переменную расстояния в функцию - person habiba; 01.10.2020
comment
Куда вы хотите передать переменную расстояния? он возвращает расстояние типа double, когда вы вызываете метод distance для GeoFirePoint, передавая в нем долготу и широту. - person Arpit; 02.10.2020

Возвращение расстояния с помощью geoflutterfire

Получить местоположение пользователя

Geolocator userLocation = Geolocator()

Преобразование местоположения пользователя в GeoPoint

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

Из данных вашего списка DocumentSnapshot.

Преобразовать данные списка в долготу

var latitude = data[index].data()['position']['geopoint'].latitude;

var longitude = data[index].data()['position']['geopoint'].longitude

Используйте долгую широту, чтобы определить расстояние

point.distance (широта, долгота)

var distance = point.distance(lat: latitude, lng: longitude);
person Steven Ogwal    schedule 23.08.2020