Получение текущего местоположения с разрешением не работает - PullRequest
2 голосов
/ 23 марта 2019

я использую геолокационный: '^ 3.0.1' handler_handler: '^ 3.0.0'

Теперь я хочу получить текущее местоположение пользователя и показать его на карте, когда пользователь открывает карту.

Итак, мой код:

Future<void> requestPermission() async {
    PermissionHandler()
        .checkPermissionStatus(PermissionGroup.location)
        .then((PermissionStatus permissionStatus) async {
      print("Checking Permission " + permissionStatus.toString());
      if (permissionStatus == PermissionStatus.granted) {
        _getCurrentLocation();
      } else {
        print("Asking Permission " + permissionStatus.toString());

        final List<PermissionGroup> permissions = <PermissionGroup>[
          PermissionGroup.locationWhenInUse
        ];
        final Map<PermissionGroup, PermissionStatus> permissionRequestResult =
            await PermissionHandler().requestPermissions(permissions);

        if (PermissionStatus.granted ==
            permissionRequestResult[PermissionGroup.locationWhenInUse]) {
          print("Permission Granted " + permissionStatus.toString());

          _getCurrentLocation();
        }
      }
    });
  }

и разрешения определены в манифесте для android и info.list для IOS.

Теперь проблема в том, что когда я запускаю эту функцию и когда она вызывает функцию requestPermission, она показывает всплывающее окно с запросом разрешения и

когда приложение I allow the permission вылетает с ошибкой:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions: ... java.lang.IllegalStateException: Reply already submitted

, а также результат разрешения - Permission.disabled, хотя я разрешил разрешение в настройках приложения, и в разрешении это показывает, что местоположение разрешено. но я несколько раз пытался открыть приложение, оно показывает Permission.disabled.

и даже если я deny приложение вылетает с той же ошибкой.

Итак, я пришел к выводу:

Если я allow или deny, то происходит сбой, потому что он запрашивает несколько раз, и даже если я разрешаю, результат - Permission.disabled.

Ссылка на видео: https://youtu.be/A1DKkw6u4HI

Может кто-нибудь помочь мне решить эту проблему?

Or please tell me how to take the current location map easily

1 Ответ

1 голос
/ 24 марта 2019

скажите, пожалуйста, как легко получить текущую карту местоположения

Если вам просто нужно легко получить текущее местоположение, и вам просто нужно разрешение на местоположение, то:

выможно использовать location плагин с флаттером:

В вашем pubspec.yml: location : ^2.3.0

Затем для выборки Текущее местоположение:

Место импорта Пакет

 import 'package:location/location.dart' as locationPackage;

Добавьте это в ваш штат

 locationPackage.Location _locationService = new locationPackage.Location();
     bool _permission = false;

Вызывайте эту функцию в initState или всякий раз, когда вам нужно текущее местоположение

fetchCurrentLocation() async {
    await _locationService.changeSettings(
        accuracy: locationPackage.LocationAccuracy.HIGH, interval: 1000);

    locationPackage.LocationData location;
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      bool serviceStatus = await _locationService.serviceEnabled();
      print("Service status: $serviceStatus");
      if (serviceStatus) {
        _permission = await _locationService.requestPermission();
        print("Permission: $_permission");
        if (_permission) {
          location = await _locationService.getLocation();

          print("Location: ${location.latitude}");
        }
      } else {
        bool serviceStatusResult = await _locationService.requestService();
        print("Service status activated after request: $serviceStatusResult");
        if (serviceStatusResult) {
          fetchCurrentLocation();
        }
      }
    } on PlatformException catch (e) {
      print(e);
      if (e.code == 'PERMISSION_DENIED') {
        //error = e.message;
      } else if (e.code == 'SERVICE_STATUS_ERROR') {
        //error = e.message;
      }
      location = null;
    }
  }
...