Флаттер: красный экран появляется при вычислении значения из будущей функции и значения из массива - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь вычислить расстояние между двумя точками, используя эту формулу

double calculateDistance(lat1, lon1, lat2, lon2){
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 - c((lat2 - lat1) * p) / 2 +
            c(lat1 * p) * c(lat2 * p) *
            (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
}

значение широта и lon1 от геолокация: используя getCurrentPosition , в то время как

значение lat2 и lon2 из класса массива , которое я сделал

но таты получают ошибку в течение нескольких миллисекунд, а появляется красный экран . потому что , когда геолокационный указатель пытался получить широту и долготу, значение lat1 и lon1 равно null , тогда "красный экран « также появится, когда GPS выключен.


это мой код функции геолокации

class _HomePageState extends State<HomePage> {
  Geolocator geolocator = Geolocator();
  Position _currentUserPosition;
  var distance;

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

  @override
  void didUpdateWidget(Widget oldWidget) {
    super.didUpdateWidget(oldWidget);
    setState(() {
      _currentUserPosition = null;
    });
  }

  _initCurrentUserLocation() async {
    geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best,
    ).then((position) {
    if (mounted) {
    setState(() =>_currentUserPosition = position);
    }
    }).catchError((e) {});
  }

и эта моя сборка виджетов с использованием ListView Builder для получения значения lat2 и lon2 из файла массива.

double calculateDistance(lat1, lon1, lat2, lon2){
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 - c((lat2 - lat1) * p) / 2 +
            c(lat1 * p) * c(lat2 * p) *
            (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
}

@override
Widget build(BuildContext context) {
  final coordinateData = Data.dataArray;
  var distance;

  return ListView.builder(
    itemCount: dataCoordinate.length,
    itemBuilder: (context, index) {

      distance = calculateDistance(
          _currentPosition.latitude, _currentUserPosition.longitude,
          coordinateData[index].lat, coordianteData[index].long
      );

      return ListTile(
          title: Text(distance.toStingAsFixed(2)),
      );
    },
  );
}

мой запрос

Как установить значение distance is null когда lat1 и lon1 по-прежнему null , или gps на мобильном телефоне выключен ?

Ответы [ 2 ]

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

В вашей функции задайте значения по умолчанию для широт и долгот

double calculateDistance({lat1=0, lon1=0, lat2=0, lon2=0}){
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 - c((lat2 - lat1) * p) / 2 +
            c(lat1 * p) * c(lat2 * p) *
            (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
}

, и при вызове функции, которую вы устанавливаете следующим образом:

distance = calculateDistance(
          lat1:_currentPosition.latitude, 
          lon1:_currentUserPosition.longitude,
          lat2:coordinateData[index].lat, 
          lon2: coordianteData[index].long,
      );

Другой способ - установить функцию для получения в виде Параметры Position and validate 2 были переданы

double calculateDistance({Position position1, Position position2}){
    if (position1 == null || position2 == null) return 0;
    var lat1=position1.lat, lon1=position1.lon;
    var lat2=position2.lat, lon2=position2.lon;
    var p = 0.017453292519943295;
    var c = cos;
    var a = 0.5 - c((lat2 - lat1) * p) / 2 +
            c(lat1 * p) * c(lat2 * p) *
            (1 - c((lon2 - lon1) * p)) / 2;
    return 12742 * asin(sqrt(a));
}
0 голосов
/ 24 марта 2020
getCurrentLocation() async {
    //Future because we dont know its future value
    try {
      Position position = await Geolocator()
          .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
      latitude = position.latitude;
      longitude = position.longitude;
    } catch (e) {
      print("PERMISSION Denied");
    }

оберните этот код в блок try catch и используйте asyn c, ожидайте получения условий будущего значения при выполнении блока catch: 1. permisiion denied 2. not get location

в Блок catch выполняет то, что вы хотите, если выполняется любое из следующих условий. Вам не нужно, если в других условиях просто используйте try catch и asyn c, ожидайте Bettr до go для asyn c, ждите учебник, просто Google, если вы не поняли мою точку зрения.

...