JamesPiner Ответов: 0

Сортировка списка карт по широте и долготе в flutter от firestore


Пытаясь отсортировать свой список карт по широте и долготе, которые я установил в качестве полей в Firestore для местоположения пользователя в Flutter (по их широте и долготе). Кто-нибудь знает, как это сделать? Мой код ниже в функции сортировки только изменил порядок моих карточек по убыванию документов в моей базе данных:

import 'dart:async';
import 'package:geolocator/geolocator.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:swiftbee/Cards/Merchant Card.dart';
import 'package:cloud_firestore/cloud_firestore.dart';


class BakeryList extends StatefulWidget {

  @override
  _BakeryListState createState() => _BakeryListState();
}

class _BakeryListState extends State<BakeryList> {


  StreamSubscription<QuerySnapshot> subscription;
  List bakeryList;

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

  Geolocator geolocator = Geolocator();

  Position userLocation;


  Future<Position> getLocation() async {
    var currentLocation;
    try {
      currentLocation = await geolocator.getCurrentPosition(
          desiredAccuracy: LocationAccuracy.best);
    } catch (e) {
      currentLocation = null;
    }
    return currentLocation;
  }

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

    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 merchantTextPath = bakeryList[index].data['name'];
          String locationNamePath = bakeryList[index].data['location'];

          double latitudePath = bakeryList[index].data['latitude'];
          double longitudePath = bakeryList[index].data['longitude'];
          String geoPath = '$latitudePath, $longitudePath';


          void distanceCalc() async {
            userLocation = await getLocation();

            final double myPositionLat = userLocation.latitude;
            final double myPositionLong = userLocation.longitude;

            final double Lat = bakeryList[index].data['latitude'];
            final double Long = bakeryList[index].data['longitude'];

            final DistanceInMetres = await Geolocator().distanceBetween(myPositionLat, myPositionLong, Lat, Long)/1000;
            final Time = DistanceInMetres / 12 * 60;

            bakeryList.sort((a, b){
              return DistanceInMetres.toInt();
            });
          }

          distanceCalc();



          return BakeryCard(
            etaText: '',
            locationText: locationNamePath,
            merchantText: bakeryTextPath,
            assetImage: Image.network(imgPath),

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

  }
}


Что я уже пробовал:

Попытался отсортировать его с помощью функции compareTo между двумя строками '$myPositionLat, $myPositionLong' и '$geoPath'. Это тоже не сработало.

0 Ответов