돌아오신 것을 환영합니다
이제 지난 영상에서 했던 작업과 retrofit 객체 혹은 클라이언트 URL을 설정을 결합해볼것인데
이는 기본 URL에 추가로 이 인터페이스에서 준비한것들을 붙히는것입니다
우선 New에서
Kotline file/class
Object를
선택하고 이름을 RetrofitClient로 하겠습니다
네
이건 했던적이 있습니다
지금은 기본 URL을 사용합니다
그러니 private const val이 BASE_URL이고 그것은 여기에서 온 URL입니다
https까지가 기본 URL이구요
선택한것을 여기에 넣습니다
그리고 create 함수는 매개변수는 없고 geocodingAPIService를 반환합니다
방금 전 우리가 만든것이죠
그리고 여기엔 retrofit 객체를 만들어 Retrofit
.Builder
그리고 이 Builder은
먼저 retrofit을 import 하겠습니다
Retrofit 클래스를 import 시키고
이 builder은 기본 URL이 필요합니다
그러니 BASE_URL을 넣고
그리고 converter factory도 필요합니다
그러니 우리의 GsonConverterFactory 추가하는데 이것은 기억하신다면
Gradle에서 썼던것입니다
여기
Converter-gson이 있죠
이것이 우리가 gson converter factory를 사용할 수 있게 합니다
이것을 다른 라인에 넣겠습니다
이제 create(생성)을 해야하니 GsonConverterFactory.create을 하고
이 create 함수는 gson converter factory를 반환하는데
그것이 이 converter factory가 필요한것 입니다
여기에 NonNull과 Converter Factory가 필요하다고 합니다
그리고 여기 build라고 해야 합니다
좋아요
이것이 retrofit을 준비할것이고
여기에 return retrofit.create
그리고 GeocodingApiService 를 클래스로 패스합니다
: :class.java 로 패스합니다
이것이 retrofit 클라이언트를 만드는 서비스 클래스 입니다
이제 이 create 함수를 실제로 사용해보겠습니다
View Model 안에서 사용합니다
Okay.
왜냐하면 뷰 모델이 기본적으로 데이터를 가져오거나 관리를 담당하기 때문입니다
그러니 뷰 모델을 찾아서
여기 LocationViewModel이 있네요
우리의 위치 뷰 모델은 위치 뿐만 아니라 주소도 관리하고 있습니다
여기 mutableStateOf 등등 했던것처럼 똑같이 해야 합니다
여기에 private 변수 address를 만듭니다
이것또한 mutableStateOf 이고
그리고 내용은 listOf
타입을 GeocodingResult로 정의합니다
이렇게
이것이 저희 주소입니다
그리고 주소를 드러내기 위해서 State
List〈GeocodingResult〉 가 address가 됩니다
이것이 우리의 변수입니다
보시면 이것은 MutableState of GeocodingResult의 List인것이고
그리고 이 private 변수를 공개 변수인 address에 패스하는것 입니다
Location에 했던것과 동일하게 하는것 입니다
이제 실제 주소를 어떻게 얻을까요
그것을 위한 function을 만들겠습니다
이름은 fetchAddress로 하겠습니다
이 fetchAddress function은
뭐가 필요하냐면
이 retrofit 클라이언트를 써야합니다
봅시다
여기에 위도와 경도와 key 를 패스해야 합니다
네
ㅤ
지금은 latlng을 string으로 패스하겠습니다
그리고 여기에 key도 패스할 수 있지만
이 function에 바로 하드코딩 할 수도 있습니다
지금은 간단하게
여기에 하드코딩을 하겠습니다
여기에 코드 루틴을 쓰고싶으니 try catch(예외처리)를 하겠습니다
Suspend function을 불러올건데
Suspend function을 불러올때는 코드 루틴을 사용해야 합니다
그렇기 때문에 이 viewModelScope.launch 안에서 하는것이고
이것이 코드 루틴을 시작할 것 입니다
이 catch에는
Exception을 catch 해야 합니다
기본 exception을 쓰겠습니다
그리고 여기서는 콘솔에 무언가를 log 하고 싶다고 합니다
여기에 res1 이라고 하고
그리고 메세지는 $e.cause
그리고 $e.message입니다
이게 무엇이냐면
여기서는 logcat을 사용하고 있는것 입니다
Logcat은 여기 보이는 작은 고양이고 이는 어플리케이션 내부에서 무슨일이 일어나고 있는지
어떤 리소스가 로딩 되었고 어떤 코드가 실행되었는지 등에 대한 항목을 찾을 수 있습니다
Logcat은 많은 정보를 제공하며 여러분이 logcat에게 직접 쓸 수도 있습니다
이 같은 경우엔 이 exception이 주는 오류의 cause, 그리고 오류의 message를 사용하여
Logcat에게 쓰겠습니다
e.cause와 e.message 그런것 입니다
그것들은 tag res1 안에서 찾을 수 있습니다
여기 태그가 있습니다
OpenGL render 등등
모두 태그 입니다
그리고 자체태그를 사용하여 앞으로 발견할 오류를 찾을 수 있습니다
이 fetchAddress viewModelScope안에서 어떤게 실행되어야 하냐면
우리는 retrofitClient의 의 Result를 얻고싶습니다
여기에 getAddressFromCoordinates를 추가하고
여기에 위도와 경도 그리고 key를 패스합니다
저의 key는 이전에 안드로이드 Maifest에 저장하였으니
여기와서 복사 해가겠습니다
다른 방법도 있지만 지금은 간단하게 하기 위하여 여기에 key를
패스하겠습니다
위도와
경도는 여기
좌표와 key가 이 getAddressFromCoordinate suspend 함수가
필요한것이니
여기에 위도와 경도 그리고 key를 줍니다
이제 이것이 우리의 result가 되는데
이 result는 우리가 알고싶은게 아닙니다
우리가 관심있는것은 값입니다
그리고 그것을 address안에 저장하려고 합니다
이 address 안에 말입니다
그러니 여기에 _address.value 는 result.results라고 하겠습니다
왜냐하면 results가 어떤 타입인지 기억하신다면
GeocodingResponse 타입이고 geocoding results 리스트를 가지고 있습니다
이것이 우리가 필요한 주소를 알려주는 것 입니다
리스트의 첫번째 항목을 가져와 사용자 화면에 표시할 수 있습니다
이 라인이 하는일이 그것입니다
좋아요
이것으로
데이터 가져오기 로딩하기 그리고 데이터 변환에 대한것이 다 인것 같습니다
이제 이 함수를 사용해서 실제로 데이터를 표시해야 합니다
이는 dialogue 내부에 표시하고 그것이 위치 LocationSelectionScreen 컴포저블을
표시합니다
여기 이것인데 이것은 화면 전체를 차지하지는 않을것이고
팝업창 같이 구글지도가 표시될 것입니다
그리고 그 밑에 버튼까지
다음 영상에서 그것들을하고 앱을 마무리 하겠습니다