Как отсортировать пользователей по расстояниям, т.е. расположить их по ближайшим пользователям? Я могу привести пользователей в пределах определенного радиуса без сортировки - PullRequest
0 голосов
/ 05 мая 2020

Я могу привести пользователей, находящихся в определенном радиусе, к текущему пользователю (т. Е. Пользователей в пределах 10 км). Теперь я хочу отсортировать их по расстоянию, перечислить в первую очередь ближайшие. Я попробовал следующий код, чтобы решить эту проблему, но получил ошибку:

Ошибка: Получил эту ошибку: «Необработанное исключение: PlatformException (error, Invalid Query. 'In' фильтры не могут содержать 'null' в массиве значений., null) "-

Подробный код:

Модель Temp: (для коллекции, в которой хранятся идентификаторы пользователей и их географическое положение )

 class certainrangeusers {
 final String id;//users ids
 final double away;//to store distance
 final GeoPoint userpoint;//other users geopoints
  certainrangeusers({this.id, this.away, this.userpoint});
  }

Переменные:

  List<certainrangeusers> info= [];

код:

       getUsers() async
         {
          double radius = 0.3;
            String field = "GeoPosition";
             print(currentUser.point.longitude);
                GeoFirePoint center = geo.point(latitude: currentUser.point.latitude,
     longitude: currentUser.point.longitude); // Here to calculate the geopositon, geohash and geopoint of the current user

   var collectionRef = Firestore.instance.collection('user_locations').document(currentUser.pincode)
     .collection('Users_comp  lete_address_and_geopoint');

      this.stream =  geo.collection(collectionRef: collectionRef)
          .within(center: center, radius: radius, field: field, strictMode: false);

        Future<List<certainrangeusers>> users1 =  stream.first.then((documents) => documents.map((doc) => 
      certainrangeusers(
     id: doc['userPhone'],
    userpoint : doc['GeoPosition']['geopoint'], // here other users geopoints who are in 300mteres range are stored
   )
    ).toList());

      users1.then((val) async{
       for(var value in val){ // this loop is to calculate the distance of the current user to the other users 
        info.add(certainrangeusers(
        away: await Geolocator().distanceBetween(currentUser.point.latitude,currentUser.point.longitude, value.userpoint.latitude, value.userpoint.longitude),
          //away: center.distance(lat: value.userpoint.latitude,lng: value.userpoint.longitude),
                     ));
              info.sort((a,b) => a.away.compareTo(b.away));//here we r sorting them
            }
          List ids = [];
          for(var value in info){
         ids.add(value.id);// adding them to empty list in order to bring them according to their ids sorted
             }
        QuerySnapshot snapshot = await Firestore.instance.collection('users').where('id', whereIn: ids).getDocuments(); // here we are passing the above list of ids
       List<User> users = snapshot.documents.map((doc) => User.fromDocument(doc)).toList();
        setState(() {
        this.users = users;
             });
          });
      }

Скриншот: [ В области розового поля все вычисления выполнены и присвоены идентификаторы, и только те документы, которые были принесены из коллекции пользователей firebase ]

Click here for the screenshot of the above, where specific place, I was struck

1 Ответ

0 голосов
/ 05 мая 2020

Это можно легко решить, добавив «id» в сам for l oop, как показано ниже:

       for(var value in val){ // this loop is to calculate the distance of the current user to the other users 
              info.add(certainrangeusers(
                   away: await Geolocator().distanceBetween(currentUser.point.latitude,currentUser.point.longitude,value.userpoint.latitude, value.userpoint.longitude),
                   id: value.id,
                 ));
          info.sort((a,b) => a.away.compareTo(b.away));//here we r sorting them
        }
...