Как отсортировать список мест в флаттере от Firestore? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть коллекция в моей базе данных пожарных баз firebase, называемая «пекарни», и внутри коллекции есть серия документов, каждый с полем геопозиции, где я напечатал их широты и долготы. Чтобы получить к ним доступ и увидеть ближайшие пекарни для пользователей, я создал ListView.builder. Но я пытаюсь отсортировать bakeryList по его геопункту относительно текущего местоположения пользователя, и он не работает. Я пробовал это:

bakeryList.sort((a, b){
  return a['geopoint'].compareTo(myLocation);
});

Но это не возвращает ближайшие пекарни. Любые идеи будут высоко оценены!

  final userLocation = Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

StreamSubscription<QuerySnapshot> subscription;
  List <DocumentSnapshot> bakeryList;

  final Query collectionReference = Firestore.instance.collection(('bakeries'));

  @override
  void initState() {
    super.initState();

    final myLocation = Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

    subscription = collectionReference.snapshots().listen((data) {
      setState(() {
        bakeryList = data.documents;

      });
    });

  }



  @override
  Widget build(BuildContext context) {


    return bakeryList != null ?

    ListView.builder(

            itemCount: bakeryList.length,
            itemBuilder: (context, index){

          String imgPath = bakeryList[index].data['image'];
          String bakeryTextPath = bakeryList[index].data['name'];
          String locationNamePath = bakeryList[index].data['location name'];
          GeoPoint geoPointPath = bakeryList[index].data['geopoint'];
          final geolocation = Text('${geoPointPath.latitude}, ${geoPointPath.longitude}');

          return BakeryCard(
            etaText: '${geoPointPath.latitude}, ${geoPointPath.longitude}',
            locationText: locationNamePath,
            merchantText: bakeryTextPath,
            assetImage: Image.network(imgPath),

            function: (){});
        })
        : Center(child: CircularProgressIndicator(),
    );

  }

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Я думаю, что ваша проблема в функции сортировки:

bakeryList.sort((a, b){
  return a['geocode'].compareTo(myLocation);
});

Здесь вы просто сравниваете положение первой пекарни с местоположением пользователя. Я думаю, что вы действительно хотите что-то вроде:

bakeryList.sort((a, b){
  return distance(a['geocode'], myLocation).compareTo(distance(b['geocode'], myLocation));
});

, где функция distance дает вам расстояние между двумя точками.

0 голосов
/ 23 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...