Flutter-geolocator: Kecelakaan saat izin ditolak

Dibuat pada 13 Des 2018  ·  7Komentar  ·  Sumber: Baseflow/flutter-geolocator

Laporan Bug

Meskipun mengizinkan izin lokasi, itu berfungsi dengan baik, tetapi ketika menolak izin lokasi saya mendapatkan kesalahan berikut.

Kesalahan Dart: Pengecualian yang tidak ditangani:
PlatformException(PERMISSION_DENIED, Akses ke data lokasi ditolak, null)

0 Geolocator._handleInvalidPermissions (paket: geolocator/geolocator.dart:197:7)

1 Geolocator.getCurrentPosition (paket: geolocator/geolocator.dart:106:7)

2 SignupScreenPageState._submitAction (paket: locum_mate/Screens/signup.dart:126:10)

3 DaftarScreenPageState.buildWidget..(paket: locum_mate/Layar/signup.dart:261:31)

4 _InkResponseState._handleTap (paket:flutter/src/material/ink_well.dart:507:14)

5 _InkResponseState.build.(paket:flutter/src/material/ink_well.dart:562:30)

6 GestureRecognizer.invokeCallback (paket:flutter/src/gestures/recognizer.dart:102:24)

7 TapGestureRecognizer._checkUp (paket:flutter/src/gestures/tap.dart:242:9)

8 TapGestureRecognizer.handlePrimaryPointer ( package:flutter <…>

Perilaku yang diharapkan

Harapkan perilaku harus memberi saya respons nol, sehingga kami dapat melanjutkan lebih jauh.

Langkah-langkah reproduksi

Impor pub di pubspec.yaml

Tulis kode berikut ke acara ketuk tombol apa saja
mencoba {
Posisi posisi = menunggu Geolocator()
.getCurrentPosition(Akurasi yang diinginkan: LocationAccuracy.high);
} tangkap (e) {
cetak(e);
}

Anda akan mengalami kesalahan.

Konfigurasi

Versi: 1.0.1

[✓] Flutter (Master saluran, v1.0.1-pre.2, di Mac OS X 10.14 18A384a, lokal en-GB)
[✓] Rantai alat Android - kembangkan untuk perangkat Android (Android SDK 28.0.3)
[✓] Rantai alat iOS - kembangkan untuk perangkat iOS (Xcode 10.1)
[✓] Android Studio (versi 3.2)
[✓] Kode VS (versi 1.29.1)
[✓] Perangkat yang terhubung (1 tersedia)

• Tidak ada masalah yang ditemukan!

Platform:

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

Komentar yang paling membantu

@YogeshLegendkiller , @kaumudpa , solusi yang diberikan oleh @jaumard adalah cara yang disarankan untuk menyelesaikan masalah ini.

Pendekatan lain adalah dengan menggunakan metode checkGeolocationPermissionStatus dan pastikan status disetel ke PermissionStatus.granted sebelum memanggil getCurrentPosition , getLastKnownPosition atau getPositionStream metode. Namun ini berarti Anda harus berhati-hati meminta izin sendiri. Sebagai contoh:

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

Semua 7 komentar

Sudahkah Anda memecahkan ini bagaimana menangani ini?

Ada solusi untuk ini?

@YogeshLegendkiller @kaumudpa jika Anda ingin menyelesaikannya, coba tangkap panggilan dan kembalikan null pada PlatformException.

@YogeshLegendkiller , @kaumudpa , solusi yang diberikan oleh @jaumard adalah cara yang disarankan untuk menyelesaikan masalah ini.

Pendekatan lain adalah dengan menggunakan metode checkGeolocationPermissionStatus dan pastikan status disetel ke PermissionStatus.granted sebelum memanggil getCurrentPosition , getLastKnownPosition atau getPositionStream metode. Namun ini berarti Anda harus berhati-hati meminta izin sendiri. Sebagai contoh:

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

Bagaimana cara meminta izin?

@abdullah4one Anda dapat menggunakan permission_handler dan meminta izin seperti ini:

import 'package:permission_handler/permission_handler.dart';

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

Mungkin terlambat untuk membalas tetapi saya juga menghadapi masalah yang sama di mana aplikasi tidak meminta izin di iOS dan berfungsi dengan baik di Android.

Karena tidak dimintai izin makanya kode izin tidak berfungsi untuk iOS. Saya menemukan paket bernama "location_permissions" yang dapat digunakan untuk meminta izin secara manual.

Langkah-langkah yang harus dilakukan adalah sebagai berikut

  1. Tambahkan "location_permissions: 3.0.0+1" dependensi ini di "pubspec.yaml". Harap dicatat bahwa saya melakukannya untuk flutter 1.22.0 jadi untuk flutter 2.0 ini mungkin menjadi masalah.
  2. Impor paket dalam file

    import ' package:location_permissions/location_permissions.dart ';

  3. Tambahkan kode berikut pada halaman tempat Anda ingin meminta izin. (Lebih baik menambahkannya di halaman pertama aplikasi Anda.)

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

    }

  4. Tambahkan dua metode berikut dalam file yang sama

    batal lokasi_permission() async {
    izin PermissionStatus final = menunggu _getLocationPermission();
    if (izin == PermissionStatus.granted) {
    posisi akhir = menunggu geolocator.getCurrentPosition(
    Akurasi yang diinginkan: LocationAccuracy.best);

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

    }

    Masa depan_getLocationPermission() asinkron {
    izin PermissionStatus akhir = menunggu LocationPermissions()
    .checkPermissionStatus(level: LocationPermissionLevel.location);

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

    }

Itu saja sekarang Anda harus mendapatkan popup di aplikasi iOS yang akan meminta izin lokasi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat