Отключение сообщения GPS и постоянное обновление местоположения - PullRequest
0 голосов
/ 03 мая 2020

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

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

import 'package:flutter_map/flutter_map.dart';
import 'package:geolocator/geolocator.dart';
import 'package:latlong/latlong.dart';


class MapState with ChangeNotifier {

  bool locationServiceActive = true;

  MapController _mapController;
  MapController get mapController => _mapController;

  static var _initialPosition;
  var _lastPosition = _initialPosition;
  LatLng get initialPosition => _initialPosition;
  LatLng get lastPosition => _lastPosition;

  MapState(){
    checkGPS();
    _getUserLocation();
  }


  checkGPS() async{
    bool conn = await Geolocator().isLocationServiceEnabled();
    if(conn == false){
      locationServiceActive = false;
    } else {
      locationServiceActive = true;
    }
    notifyListeners();
  }

  void _getUserLocation() async{
    Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    print("/////////////////////////////////////////////////////////////////////////////////position");
    print(position);

    _initialPosition = LatLng(position.latitude, position.longitude);
    notifyListeners();
  }
}

обновление: - я изменил свою функцию _getUserLocation на поток, который работает намного лучше, если пользователь включил или выключил gps (и он использует последнее известное местоположение, если gps выключен) ... но это не так t вывести оператор в терминале, если позиция нулевая, что странно, только когда есть lat и lng !!!

вот модификация, которую я сделал ...

void _getUserLocation() async{
    Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    var geolocator = Geolocator();
    var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);

    StreamSubscription<Position> positionStream = geolocator.getPositionStream(locationOptions).listen(
      (Position position) {
        print("/////////////////////////////////////////////////////////////////////////// position");
        print(position == null ? 'Unknown' : position.latitude.toString() + ', ' + position.longitude.toString());
      });
      _initialPosition = LatLng(position.latitude, position.longitude);
    notifyListeners();
  }

1 Ответ

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

Если вы хотите уведомить пользователя о GPS, вы можете использовать что-то вроде этого

  @override
  void initState() {
    super.initState();
    initPlatformState();
    location.onLocationChanged.listen((result) {
      currentLocation = result;
// your code
      });
    });
  }

  void initPlatformState() async {
    LocationData currentLocation;
    try {
      currentLocation = await location.getLocation();
      error = "";
    } on PlatformException catch (e) {
      if (e.code == 'PERMISSION_DENIED')
        error = 'Permission Denied';
      else if (e.code == 'PERMISSION_DENIED_NEVER_ASK')
        error =
            'Permission denied - please ask the user to enable it from the app settings';
      currentLocation = null;
    }
    setState(() {
      currentLocation = currentLocation;
    });
  }

Здесь вы слушаете поток местоположения, если он включен. Если это не так, выдает ошибку. Используемый здесь пакет location

...