이제 앞서 사용한 camera 코드에 location 기능을 붙여보자.
우선 flutter location은 역시 pub.dev에서 받을 수 있다.
flutter location의 특징은 역시 사용자의 핸드폰의 위치정보를 가져올 수 있다.
또한 flutter native 코드보다 쉽게 사용자 위치정보를 가져올 수 있다.
하지만 flutter는 매우 친절하게 해결법 까지 제시하였다. 그래서 해당 path로 들어가서 최상단의 buildscript의 코틀린 버전을 명시해준 최신 버전으로 업그레이드 시켜주면 된다.
원인은 location 플러그인에서 최신 버전(2023.08.07일 기준)을 받았을 때 작성한 코틀린 버전이 최소 1.9.0으로 설정되어 그런듯 하다.
# Uncomment this line to define a global platform for your project
platform :ios, '15.0'
2023.08.07일 기준 15 버전으로 하면 된다고 한다. 혹시 안 된다고 한다면 나무 위키에서 iOS 버전을 확인하여 +1 씩 높혀보도록 하자
조금 아쉬운 점이 location 플러그인의 공식 문서에 이러한 버전에 대하여 아무런 명시가 없다는 것이 조금 아쉬웠다.
공식 홈페이지에 있는 사용자 정보 가져오기를 우선 복붙하였다. 이때 Location location = new Location();
의 코드 중 new
키워드는 예전 dart 문법이므로 빼도 된다.
그리고 전역으로 사용하기 위해 _
키워드를 뺴면 아래와 같은 코드가 나오게 된다.
void _getCurrentLocation () async {
Location location = Location();
bool serviceEnabled;
PermissionStatus permissionGranted;
LocationData locationData;
// 서비스가 가능한지 확인하는 코드
serviceEnabled = await location.serviceEnabled();
if (!serviceEnabled) {
serviceEnabled = await location.requestService();
if (!serviceEnabled) {
return;
}
}
// 사용자의 허락이 떨어졌는지 확인하는 코드
permissionGranted = await location.hasPermission();
if (permissionGranted == PermissionStatus.denied) {
permissionGranted = await location.requestPermission();
if (permissionGranted != PermissionStatus.granted) {
return;
}
}
locationData = await location.getLocation();
}
로딩 스피너를 사용하기 위해서 우선 isLoading이라는 변수를 하나 선언하고 UI를 업데이트 해야하므로 getLocation() 메서드 주위를 setState로 감싸준다.
그 후 build 위젯에서 콘텐츠 변수를 만들어주고 앞서 하드코딩해두었던 Text 위젯을 선언하고
if 조건문으로 CircularProgressIndicator
즉, 로딩 스피너 위젯을 넣어주면 된다.