이번에는 저번 작업에 이어 진행을 해보려하는데
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');
}
}