// latitude - 위도, longtitude - 경도
// 지도의 첫 위치
static final LatLng companyLatLng = LatLng(37.55769913670688,
127.04587054138098,);
// zoom level
static final CameraPosition initialPosition = CameraPosition(target: companyLatLng,
zoom: 15,
);
지도 class
class _CustomGoogleMap extends StatelessWidget {
final CameraPosition initialPosition;
const _CustomGoogleMap({ required this.initialPosition, Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Expanded(
flex: 2,
child: GoogleMap(
mapType: MapType.normal,
initialCameraPosition: initialPosition,
),
);
}
}
// 위치 권한 요청
FutureBuilder(
// future: future을 return 해주는 어떤 함수든 넣을 수 있다
// 함수의 상태가 변경이 될 때마다 builder를 다시 실행해서 화면을 다시 그려준다, future 안에 들어간 함수가 return해준 값을 snapshot에서 받아볼 수 있다
future: checkPermission(),
// snapshot.connectionState 에서 connectionState는 ConnectionState 타입이며 none, waiting, done 값을 가지고 있다
// snapshot.data는 futre에 있는 함수에서 return한 결과가 저장된다.
builder: (BuildContext context, AsyncSnapshot snapshot) {
if(snapshot.connectionState == ConnectionState.waiting){
return Center(
child: CircularProgressIndicator(),
);
}
// 위치 권환이 허가 됐을 때만 column(지도가 보이는 위젯)을 return 해줘야 한다
if(snapshot.data == '위치 권한이 허가됐습니다.'){
return Column(
children: [
_CustomGoogleMap(initialPosition: initialPosition),
_ChoolCheckButton(),
],
);
}
return Center(
child: Text(snapshot.data),
);
}
),
);
}
// 위치 권한 요청
// initialCameraPosition: 처음 구긁 지도를 켰을 때 어느 위치를 바라보고 있을지를 결정
// FutureBuilder 내의 future: checkPerimission() 실행 > 변경되는 점이 있으면 > > builder: (context)가 함수를 실행한다 >
// checkPermission()을 실행한 결과를 snapshot에 return한다
Future checkPermission() async {
// 앱과 상관없는 휴대폰 자체의 위치 활성화 기능을 사용할 수 있는가
final isLocationEnabled = await Geolocator.isLocationServiceEnabled();
if (!isLocationEnabled) {
return '위치 서비스를 활성화 해주세요.';
}
// LocationPermission 이라는 형태로 Geolocator.checkPermission()은 현재 앱이 갖고 있는 위치 서비스에 대한 권한이 어떻게 되는지를 가져온다
LocationPermission checkedPermission = await Geolocator.checkPermission();
if (checkedPermission == LocationPermission.denied) {
checkedPermission = await Geolocator.requestPermission();
if (checkedPermission == LocationPermission.denied) {
return '위치 권한을 허가해주세요';
}
}
if (checkedPermission == LocationPermission.denied) {
return '앱의 위치 권한을 세팅해서 허가해주세요.';
}
return '위치 권한이 허가됐습니다.';
}