Flutter Как синхронизировать c между именем и вычислить расстояние - PullRequest
0 голосов
/ 05 мая 2020

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

Data.dart

class Market{
  static List dataMarket = [
    Data(
        nameDest = 'Alfamart',
        latitudeDest: -6.163891,
        longitudeDest: 106.628915),
    Data(
        nameDest = 'Minis'
        latitudeDest: -6.211269,
        longitudeDest: 106.615574),
    Data(
        nameDest = 'Star Market'
        latitudeDest: -6.223254,
        longitudeDest:  106.703905),
    Data(
        nameDest = 'Allmark'
        latitudeDest: -6.163891,
        longitudeDest: 106.628915),
    Data(
        nameDest = 'Eig Store'
        latitudeDest: -6.178293, 
        longitudeDest: 106.631862,),
  ];
}

class Data{
  String nameDest;
  var latitudeDest;
  var longitudeDest;

  Data({
     this.nameDest
     this.latitudeDest,
     this.longitudeDest});
}

MyListMarket.dart

import 'package:example/Data.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math' show cos, sqrt, asin;

import 'package:geolocator/geolocator.dart';

 class _DeleteWidgetState extends State<DeleteWidget> {
  var lastLatitude;
  var lastLongitude;
  final dataInstance = Market.dataMarket;
  var newSortRange = [];

  @override
  void initState() {
    super.initState();
    //_initUserLocation();
  }

  Future<int> _initUserLocation() async {
    try {
      await Future.delayed(Duration(seconds: 1));
      Position position = await Geolocator()
             .getLastKnownPosition(desiredAccuracy: LocationAccuracy.best);
      lastLatitude = position.latitude;
      lastLongitude = position.longitude;
    } catch (e) {
      print("Permission Denied");
    }
    return 1;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color.fromRGBO(246, 246, 246, 1),
      body: FutureBuilder(
        future: _initUserLocation(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (!snapshot.hasData) {
            return CircularProgressIndicator();
          }
          if (lastLatitude == null || lastLongitude == null) {
            for (int i = 0; i < dataInstance.length; i++) {
              newSortRange.add(0.00);
            }
          } else {
            for (int i = 0; i < dataInstance.length; i++) {
              //calculating distance with lat1, lon1, lat2, lon2

              var p = 0.017453292519943295;
              var c = cos;
              var a = 0.5 -
                  c((dataInstance[i].latitudeDest - lastLatitude) * p) / 2 +
                  c(lastLatitude * p) *
                      c(dataInstance[i].latitudeDest * p) *
                      (1 -
                          c((dataInstance[i].longitudeDest - lastLongitude) *
                              p)) /
                      2;
              newSortRange.add(12742 * asin(sqrt(a)));
            }
          }
          newSortRange.sort();
          print(newSortRange);
          return ListView.separated(
              key: PageStorageKey<String>('aKey'),
              physics: BouncingScrollPhysics(),
              itemCount: newSortRange.length,
              itemBuilder: (context, index) {
                return Material(
                  color: Color.fromRGBO(251, 251, 251, 1),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      ListTile(
                        trailing: Text(
                          newSortRange[index].toStringAsFixed(2) + "\nKM",
                          style: new TextStyle(
                            fontSize: 13,
                          ),
                          textAlign: TextAlign.right,
                        ),
                      ),
                    ],
                  ),
                );
              },
              separatorBuilder: (context, index) {
                return Divider(
                  height: 0.0,
                  thickness: 0.7,
                );
              });
        },
      ),
    );
  }
}

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

может быть, я могу сохранить вычисленное расстояние в массиве данных newRange null?

class Market{
  static List dataMarket = [
    Data(
        nameDest = 'Alfamart',
        latitudeDest: -6.163891,
        longitudeDest: 106.628915,
        newRange: null),
    Data(
        nameDest = 'Minis'
        latitudeDest: -6.211269,
        longitudeDest: 106.615574,
        newRange: null),
    Data(
        nameDest = 'Star Market'
        latitudeDest: -6.223254,
        longitudeDest:  106.703905,
        newRange: null),
    Data(
        nameDest = 'Allmark'
        latitudeDest: -6.163891,
        longitudeDest: 106.628915,
        newRange: null),
    Data(
        nameDest = 'Eig Store'
        latitudeDest: -6.178293, 
        longitudeDest: 106.631862,
        newRange: null),
  ];
}

class Data{
  String nameDest;
  var latitudeDest;
  var longitudeDest;
  var newRange;

  Data({
     this.nameDest
     this.latitudeDest,
     this.longitudeDest,
     this.newRange});
}

, если можно сохранить вычисленное расстояние в newRange . так как я могу хранить данные в массиве? или есть другой способ синхронизировать данные об имени и расстоянии c?

1 Ответ

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

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

Полная демонстрация поможет вам понять больше.

class DeleteWidget extends StatefulWidget {
  @override
  _DeleteWidgetState createState() => _DeleteWidgetState();
}

class _DeleteWidgetState extends State<DeleteWidget> {
  var lastLatitude;
  var lastLongitude;
  final dataInstance = Market.dataMarket;
  var newSortRange = [];

  @override
  void initState() {
    super.initState();
    //_initUserLocation();
  }

  Future<int> _initUserLocation() async {
    try {
      await Future.delayed(Duration(seconds: 1));
      //     Position position = await Geolocator()
      //       .getLastKnownPosition(desiredAccuracy: LocationAccuracy.best);
      lastLatitude = -6.163891; //position.latitude;
      lastLongitude = 106.628915; //position.longitude;
    } catch (e) {
      print("Permission Denied");
    }
    return 1;
  }

  void bubbleSort() {
    int n = newSortRange.length;
    int i, step;
    for (step = 0; step < n; step++) {
      for (i = 0; i < n - step - 1; i++) {
        if (newSortRange[i] > newSortRange[i + 1]) {
          swap(i);
        }
      }
    }
  }

  void swap(int i) {
    double temp = newSortRange[i];
    newSortRange[i] = newSortRange[i + 1];
    newSortRange[i + 1] = temp;
    Data _data = dataInstance[i];
    dataInstance[i] = dataInstance[i + 1];
    dataInstance[i + 1] = _data;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color.fromRGBO(246, 246, 246, 1),
      body: FutureBuilder(
        future: _initUserLocation(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (!snapshot.hasData) {
            return CircularProgressIndicator();
          }
          if (lastLatitude == null || lastLongitude == null) {
            for (int i = 0; i < dataInstance.length; i++) {
              newSortRange.add(0.00);
            }
          } else {
            for (int i = 0; i < dataInstance.length; i++) {
              //calculating distance with lat1, lon1, lat2, lon2

              var p = 0.017453292519943295;
              var c = cos;
              var a = 0.5 -
                  c((dataInstance[i].latitudeDest - lastLatitude) * p) / 2 +
                  c(lastLatitude * p) *
                      c(dataInstance[i].latitudeDest * p) *
                      (1 -
                          c((dataInstance[i].longitudeDest - lastLongitude) *
                              p)) /
                      2;
              newSortRange.add(12742 * asin(sqrt(a)));
              dataInstance[i].newRange = 12742 * asin(sqrt(a));
            }
          }
          bubbleSort();
          //newSortRange.sort();
          print(newSortRange);
          return ListView.separated(
              key: PageStorageKey<String>('aKey'),
              physics: BouncingScrollPhysics(),
              itemCount: newSortRange.length,
              itemBuilder: (context, index) {
                return Material(
                  color: Color.fromRGBO(251, 251, 251, 1),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      ListTile(
                        trailing: Column(
                          children: [
                            Text(
                              newSortRange[index].toStringAsFixed(2) + "\nKM",
                              style: new TextStyle(
                                fontSize: 13,
                              ),
                              textAlign: TextAlign.right,
                            ),
                            Text('${dataInstance[index].newRange}')
                          ],
                        ),
                      ),
                    ],
                  ),
                );
              },
              separatorBuilder: (context, index) {
                return Divider(
                  height: 0.0,
                  thickness: 0.7,
                );
              });
        },
      ),
    );
  }
}

class Market {
  static List<Data> dataMarket = [
    Data(
        nameDest: 'Alfamart',
        latitudeDest: -6.163891,
        longitudeDest: 106.628915,
        newRange: -1),
    Data(
        nameDest: 'Minis',
        latitudeDest: -6.211269,
        longitudeDest: 106.615574,
        newRange: null),
    Data(
        nameDest: 'Star Market',
        latitudeDest: -6.223254,
        longitudeDest: 106.703905,
        newRange: null),
    Data(
        nameDest: 'Allmark',
        latitudeDest: -6.163891,
        longitudeDest: 106.628915,
        newRange: null),
    Data(
        nameDest: 'Eig Store',
        latitudeDest: -6.178293,
        longitudeDest: 106.631862,
        newRange: null),
  ];
}

class Data {
  var nameDest;
  var latitudeDest;
  var longitudeDest;
  var newRange;

  Data({this.nameDest, this.latitudeDest, this.longitudeDest, this.newRange});
}
...