이번에는 저번 작업에 이어 진행을 해보려하는데

2 flutter: check ==> Move Camera flutter: check ==> 권한 확인 다이아 로그 끝 flutter: check ==> Move Camera flutter: check ==> 권한 확인 다이아 로그 끝 5 flutter: check ==> Move Camera

흐흫 테스트 해보니 너무 잘된다. 기분이 좋다

확실한거는 나는 예약 함수를 한번도 사용해본적이 없었는데

  Future<LocationPermission> showDialogWithLocationPermission() async {
    final completer = Completer<LocationPermission>();

    final overlayContext = NaverMapOverlayService().overlayContext;
    if (overlayContext != null && overlayContext.mounted) {
      showLocationPermissionDialog(
        overlayContext,
        () async {
          final permission = await checkLocationPermission();
          completer.complete(permission);
        },
        '매장과 현재 위치 사이의 거리를 계산하여\\n더 나은 서비스를 제공하기 위해서\\n위치기반 서비스 이용약관에 동의해주세요:)',
        false,
      );
    }
    return completer.future;
  }

정말 중요한 경험이 된 것 같다… 근데 이번에 느낀점이 하나 있다. 나는 네이버 맵이 지금까지 해본 어떤 기능 중 가장 어렵지만 현재 내 수전에 완벽에 가갑게 진행해보려고 한다.

그러다보니 확실한거 한 가지는 코드를 정말 쪼개고 쪼개는 학생 때 배웠던 정말 더 이상 쪼갤 수 없을 때까지 쪼개는 그런 말이 기억나며 다시 한번 느끼게 된다.

이 이야기를 왜 꺼냈냐?..

  Future<void> moveToCurrentLocation() async {
    print('check ==> Move Camera');
    await locationAuthority();
    if (state.locationPermissionState == LocationPermissionState.granted) {
      emit(
        state.copyWith(
          currentLocation: await _locationService.getCurrentLocation(),
          locationPermissionState: LocationPermissionState.granted,
        ),
      );
      // 내위치 이동 애니메이션
      await state.mapController?.updateCamera(
        NCameraUpdate.withParams(
          target: NLatLng(
            state.currentLocation.latitude,
            state.currentLocation.longitude,
          ),
          zoom: 14,
        )..setAnimation(duration: const Duration(milliseconds: 1200)),
      );
    } else {
      await _locationService.showDialogWithLocationPermission();
      print('check ==> 권한 확인 다이아 로그 끝');
    }
  }

이 함수 때문에 그렇다

지금 권한이 허용되지 않았을 때, else문으로 빠지는데

else문에 있는 저 print 문이 동작할 때, 한번 더 권한체크를 진행하고

그럼 일단

  Future<bool> showDialogWithLocationPermission() async {
    final completer = Completer<bool>();

    final overlayContext = NaverMapOverlayService().overlayContext;
    if (overlayContext != null && overlayContext.mounted) {
      showLocationPermissionDialog(
        overlayContext,
        () async {
          final permission = await checkLocationPermission();
          // LocationPermission 결과에 따라 bool 값으로 완료 여부를 전달
          completer.complete(permission == LocationPermission.whileInUse ||
              permission == LocationPermission.always);
        },
        '매장과 현재 위치 사이의 거리를 계산하여\\n더 나은 서비스를 제공하기 위해서\\n위치기반 서비스 이용약관에 동의해주세요:)',
        false,
      );
    }
    return completer.future;
  }

이 친구를 먼저 bool 타입으로 권한을 반환할 수 있도록 진행해보자 그리고 테스트

  Future<void> moveToCurrentLocation() async {
    print('check ==> Move Camera');
    await locationAuthority();
    if (state.locationPermissionState == LocationPermissionState.granted) {
      emit(
        state.copyWith(
          currentLocation: await _locationService.getCurrentLocation(),
          locationPermissionState: LocationPermissionState.granted,
        ),
      );
      // 내위치 이동 애니메이션
      await state.mapController?.updateCamera(
        NCameraUpdate.withParams(
          target: NLatLng(
            state.currentLocation.latitude,
            state.currentLocation.longitude,
          ),
          zoom: 14,
        )..setAnimation(duration: const Duration(milliseconds: 1200)),
      );
    } else {
      bool test = await _locationService.showDialogWithLocationPermission();
      print('check ==> $test');
    }
  }