Flutter-geolocator: κΆŒν•œμ— λŒ€ν•œ 좩돌이 κ±°λΆ€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 12μ›” 13일  Β·  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 SignupScreenPageState._submitAction (νŒ¨ν‚€μ§€:locum_mate/Screens/signup.dart:126:10)

3 SignupScreenPageState.buildWidget..(νŒ¨ν‚€μ§€:locum_mate/Screens/signup.dart:261:31)

4 _InkResponseState._handleTap (νŒ¨ν‚€μ§€:flutter/src/material/ink_well.dart:507:14)

5 _InkResponseState.λΉŒλ“œ.(νŒ¨ν‚€μ§€:flutter/src/material/ink_well.dart:562:30)

6 GestureRecognizer.invokeCallback (νŒ¨ν‚€μ§€:flutter/src/gestures/recognizer.dart:102:24)

7 TapGestureRecognizer._checkUp (νŒ¨ν‚€μ§€:flutter/src/gestures/tap.dart:242:9)

8 TapGestureRecognizer.handlePrimaryPointer ( νŒ¨ν‚€μ§€:ν”ŒλŸ¬ν„° <…>

μ˜ˆμƒλ˜λŠ” 행동

μ˜ˆμƒ λ™μž‘μ€ λ‚˜μ—κ²Œ null 응닡을 μ œκ³΅ν•΄μ•Ό 더 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ²ˆμ‹ 단계

pubspec.yamlμ—μ„œ 펍 κ°€μ Έμ˜€κΈ°

λͺ¨λ“  λ²„νŠΌ νƒ­ μ΄λ²€νŠΈμ— λ‹€μŒ μ½”λ“œ μž‘μ„±
λ…Έλ ₯ν•˜λ‹€ {
μœ„μΉ˜ μœ„μΉ˜ = Geolocator() λŒ€κΈ°
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
} 작기 (e) {
인쇄(e);
}

였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

ꡬ성

버전: 1.0.1

[βœ“] Flutter(채널 λ§ˆμŠ€ν„°, v1.0.1-pre.2, Mac OS X 10.14 18A384a, λ‘œμΌ€μΌ en-GB)
[βœ“] Android 툴체인 - Android 기기용 개발(Android SDK 28.0.3)
[βœ“] iOS 툴체인 - iOS 기기용 개발(Xcode 10.1)
[βœ“] μ•ˆλ“œλ‘œμ΄λ“œ μŠ€νŠœλ””μ˜€(버전 3.2)
[βœ“] VS μ½”λ“œ(버전 1.29.1)
[βœ“] μ—°κ²°λœ μž₯치(1개 μ‚¬μš© κ°€λŠ₯)

β€’ 발견된 λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€!

ν”Œλž«νΌ:

  • [x]:아이폰: iOS
  • [ ] :λ‘œλ΄‡: μ•ˆλ“œλ‘œμ΄λ“œ

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@YogeshLegendkiller , @kaumudpa , @jaumard κ°€ μ œκ³΅ν•˜λŠ” μ†”λ£¨μ…˜μ΄ 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ μ œμ•ˆλœ λ°©λ²•μž…λ‹ˆλ‹€.

또 λ‹€λ₯Έ μ ‘κ·Ό 방식은 checkGeolocationPermissionStatus λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  getCurrentPosition , getLastKnownPosition λ˜λŠ” getPositionStream λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 μƒνƒœκ°€ PermissionStatus.granted 둜 μ„€μ •λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ getPositionStream λ©”μ„œλ“œ. κ·ΈλŸ¬λ‚˜ μ΄λŠ” μ‚¬μš©μžκ°€ 직접 κΆŒν•œμ„ μš”μ²­ν•˜λŠ” 데 μ£Όμ˜ν•΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

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

λͺ¨λ“  7 λŒ“κΈ€

이거 μ–΄λ–»κ²Œ ν•΄κ²°ν•˜μ…¨λ‚˜μš”?

이에 λŒ€ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

@YogeshLegendkiller @kaumudpa 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ ν˜ΈμΆœμ„ μž‘μ•„μ„œ PlatformExceptionμ—μ„œ null을 λ°˜ν™˜ν•˜μ„Έμš”.

@YogeshLegendkiller , @kaumudpa , @jaumard κ°€ μ œκ³΅ν•˜λŠ” μ†”λ£¨μ…˜μ΄ 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ μ œμ•ˆλœ λ°©λ²•μž…λ‹ˆλ‹€.

또 λ‹€λ₯Έ μ ‘κ·Ό 방식은 checkGeolocationPermissionStatus λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  getCurrentPosition , getLastKnownPosition λ˜λŠ” getPositionStream λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 μƒνƒœκ°€ PermissionStatus.granted 둜 μ„€μ •λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ 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. "pubspec.yaml"에 "location_permissions: 3.0.0+1" 이 쒅속성을 μΆ”κ°€ν•©λ‹ˆλ‹€. λ‚˜λŠ” flutter 1.22.0μ—μ„œ κ·Έλ ‡κ²Œ ν–ˆμœΌλ―€λ‘œ flutter 2.0μ—μ„œλŠ” 이것이 λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. νŒŒμΌμ—μ„œ νŒ¨ν‚€μ§€ κ°€μ Έμ˜€κΈ°

    κ°€μ Έμ˜€κΈ° ' νŒ¨ν‚€μ§€:μœ„μΉ˜_ν—ˆκ°€/μœ„μΉ˜_ν—ˆκ°€ .

  3. κΆŒν•œμ„ μš”μ²­ν•˜λ €λŠ” νŽ˜μ΄μ§€μ— λ‹€μŒ μ½”λ“œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€. (μ•±μ˜ 첫 νŽ˜μ΄μ§€μ— μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.)

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

    }

  4. λ™μΌν•œ νŒŒμΌμ— λ‹€μŒ 두 가지 방법 μΆ”κ°€

    무효 location_permission() 비동기 {
    μ΅œμ’… PermissionStatus κΆŒν•œ = await _getLocationPermission();
    if (κΆŒν•œ == PermissionStatus.granted) {
    μ΅œμ’… μœ„μΉ˜ = geolocator.getCurrentPosition(
    μ›ν•˜λŠ” 정확도: LocationAccuracy.best);

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

    }

    미래_getLocationPermission() 비동기 {
    μ΅œμ’… 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 λ“±κΈ‰