Flutter-geolocator: Сбой при отказе в разрешении

Созданный на 13 дек. 2018  ·  7Комментарии  ·  Источник: Baseflow/flutter-geolocator

🐛 Отчет об ошибке

При разрешении разрешения на местоположение он работает нормально, но при отказе в разрешении местоположения я получаю следующую ошибку.

Ошибка дротика: необработанное исключение:
PlatformException (PERMISSION_DENIED, доступ к данным о местоположении запрещен, null)

0 Geolocator._handleInvalidPermissions (пакет: geolocator / geolocator.dart: 197: 7)

1 Geolocator.getCurrentPosition (пакет: geolocator / geolocator.dart: 106: 7)

2 RegistrationScreenPageState._submitAction (пакет: locum_mate / Screens / signup.dart: 126: 10)

3 RegistrationScreenPageState.buildWidget..(пакет: locum_mate / Screens / signup.dart: 261: 31)

4 _InkResponseState._handleTap (пакет: flutter / src / material / ink_well.dart: 507: 14)

5 _InkResponseState.build.(пакет: flutter / src / material / ink_well.dart: 562: 30)

6 GestureRecognizer.invokeCallback (пакет: flutter / src / gestures / распознаватель.dart: 102: 24)

7 TapGestureRecognizer._checkUp (пакет: flutter / src / gestures / tap.dart: 242: 9)

8 TapGestureRecognizer.handlePrimaryPointer ( пакет: flutter <…>

Ожидаемое поведение

Ожидаемое поведение должно дать мне нулевой ответ, чтобы мы могли продолжить.

Шаги размножения

Импортировать паб в pubspec.yaml

Напишите следующий код для любого события нажатия кнопки
пытаться {
Позиция position = await Geolocator ()
.getCurrentPosition (желаемая точность: LocationAccuracy.high);
} catch (e) {
печать (е);
}

у вас будет ошибка.

Конфигурация

Версия: 1.0.1

[✓] Flutter (мастер канала, v1.0.1-pre.2, в Mac OS X 10.14 18A384a, локаль en-GB)
[✓] Android toolchain - разработка для устройств Android (Android SDK 28.0.3)
[✓] Набор инструментов iOS - разработка для устройств iOS (Xcode 10.1)
[✓] Android Studio (версия 3.2)
[✓] VS Code (версия 1.29.1)
[✓] Подключенное устройство (доступно 1)

• Проблем не обнаружено!

Платформа:

  • [x]: iphone: iOS
  • []: robot: Android

Самый полезный комментарий

@YogeshLegendkiller , @kaumudpa , решение, предоставленное @jaumard, является предлагаемым способом решения этой проблемы.

Другой подход - использовать метод checkGeolocationPermissionStatus и убедиться, что статус установлен на PermissionStatus.granted перед вызовом getCurrentPosition , getLastKnownPosition или getPositionStream методы. Однако это будет означать, что вам нужно позаботиться о том, чтобы запрашивать разрешения самостоятельно. Например:

Geolocator geolocator = Geolocator();
GeolocationStatus status = await geolocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.granted) {
    Position position = await geolocator.getCurrentPosition();
}

Все 7 Комментарий

Вы решили, как справиться с этим?

Есть ли способ обойти это?

@YogeshLegendkiller @kaumudpa, если вам нужна работа, просто попробуйте поймать вызов и вернуть null в PlatformException.

@YogeshLegendkiller , @kaumudpa , решение, предоставленное @jaumard, является предлагаемым способом решения этой проблемы.

Другой подход - использовать метод checkGeolocationPermissionStatus и убедиться, что статус установлен на PermissionStatus.granted перед вызовом getCurrentPosition , getLastKnownPosition или getPositionStream методы. Однако это будет означать, что вам нужно позаботиться о том, чтобы запрашивать разрешения самостоятельно. Например:

Geolocator geolocator = Geolocator();
GeolocationStatus status = await geolocator.checkGeolocationPermissionStatus();
if (status == GeolocationStatus.granted) {
    Position position = await geolocator.getCurrentPosition();
}

Как спросить разрешения?

@ abdullah4one Вы можете использовать permission_handler и запросить разрешение следующим образом:

import 'package:permission_handler/permission_handler.dart';

Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.location]);

Возможно, было поздно отвечать, но я также столкнулся с той же проблемой, когда приложение не запрашивало разрешение в iOS и отлично работало в Android.

Поскольку у него не спрашивали разрешения, поэтому код разрешения не работал для iOS. Я нашел пакет с именем «location_permissions», который можно использовать для запроса разрешения вручную.

Шаги, которые нужно сделать, следующие

  1. Добавьте "location_permissions: 3.0.0 + 1" эти зависимости в "pubspec.yaml". Обратите внимание, что я сделал это для flutter 1.22.0, поэтому для flutter 2.0 это может быть проблемой.
  2. Импортируйте пакет в файл

    import ' package: location_permissions / location_permissions.dart ';

  3. Добавьте следующий код на страницу, где вы хотите запросить разрешение. (Лучше добавить это на самой первой странице вашего приложения.)

     <strong i="16">@override</strong>
      void initState() {
       ....
      if (Platform.isIOS) {
        location_permission();
      }
      ....
    

    }

  4. Добавьте следующие два метода в один файл

    void location_permission () async {
    последнее разрешение PermissionStatus = ожидание _getLocationPermission ();
    if (разрешение == PermissionStatus.granted) {
    final position = await geolocator.getCurrentPosition (
    желаемая точность: LocationAccuracy.best);

      // Use the position to do whatever...
    }
    

    }

    Будущее_getLocationPermission () async {
    последнее разрешение PermissionStatus = ожидание LocationPermissions ()
    .checkPermissionStatus (уровень: LocationPermissionLevel.location);

    if (permission != PermissionStatus.granted) {
      final PermissionStatus permissionStatus = await LocationPermissions()
          .requestPermissions(
              permissionLevel: LocationPermissionLevel.location);
    
      return permissionStatus;
    } else {
      return permission;
    }
    

    }

Вот и все, теперь вы должны получить всплывающее окно в приложении iOS, которое будет запрашивать разрешение местоположения.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги