참고로 반드시 결졔 계정이 있어야만 사용 가능하다. 뭐 사실 naver cloud, AWS와 마찬가지로 다 결제 수단을 미리 등록해놓고 사용하는 것이라 무서울 수 있지만 우리는 보험까지 들어둘 것이기 떄문에 조금은 괜찮다.
일단 결제 계정을 등록을 하고 Google Maps Platform 좌측의 API 메뉴를 눌러보면 이것저것 등록을 할 수 있다.
이때
iOS라면 xCode에서 ios/Runner.xcworkspace
위치에 있는 파일을 실행한 후 Runner > TARGETS Runner > Bundle Identifier
위치에 iOS 패키지 이름이 있다고 하는데 지금은 못 찾았다; 추후 iOS로 다시 해봐야겠다. 하지만 Android의 패키지 이름과 같을듯 하다. 패키지 이름이 다른 것도 웃기니
그리고 SHA-1 인증서는 아래와 같은 명령어를
cd android&&./gradlew signingReport
프로젝트의 root path에서 입력하면 바로 찾아준다. 그리고 나온 결과값을 각각 입력해주면 API가 확실히 제한되니 안심이다.
참고로 혹시 key를 복사해두지 않았다면 당황하지 말고 좌측 "사용자 인증 정보" 탭에서 확인할 수 있으니 걱정말라
이제 본격적으로 사용해보자. 역시 공식문서를 살펴보면 자세히 나와있다.
역시 http req로 이루어지기 때문에 flutter pub add http
로 http 플러그인을 추가해주고, 공식문서에 있는 url로 http req를 날려주면 된다.
import 'dart:convert';
import 'package:http/http.dart' as http;
void _getCurrentLocation() async {
...
locationData = await location.getLocation();
final lat = locationData.latitude;
final lon = locationData.longitude;
if (lat == null || lon == null) {
return;
}
final url = Uri.parse(
'https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lon&key=$key');
final response = await http.get(url);
final resData = json.decode(response.body);
final address = resData['results'][0]['formatted_address'];
setState(() {
_pickedLocation =
PlaceLocation(latitude: lat, longtitude: lon, address: address);
_isGettingLocation = false;
});
}
앞서 사용한 location 플러그인으로 가져온 locationData의 위,경도를 공식문서에서 명시한 uri대로 만들어서 req를 날려준 후 나온 값을 response에 담아주고
앞서 dart:convert
에서 import한 json 객체의 메서드로 decode한다.
그러면 공식문서에 나온 format 대로 결과값이 나오는대 그 중 human readable한 formatted_address를 뽑으면 된다. 그리고 이를 미리 설정해둔 model을 타입으로 갖는 _pickedLocation 변수에 담아주면 된다.
여기서부터는 Google Maps Api와는 관계없지만 flutter의 상태관리는 react, vue 상태관리보다 더 어려워서 다시 한 번 작성하며 숙달하려 한다.
그리고 그 이후에 state lift 방식 (자식 위젯에 Function 만들어서 매개변수로 값 넘겨주기) 으로 부모위젯에서 값을 받아서 기설정한 Provider에 넣어준 다음