쇼핑리스트 앱 전체리뷰
NavController
보통 모든 페이지는 NavController위에서 돌아가야 되서 어지간하면 페이지를 나타내는 Composable 함수들은 파라미터로 context, navcontroller, 부가적인 객체 들을 포함한다

dialog는 일종의 팝업창인데 LocationSelectionScreen에서 GoogleMap Composable함수를 불러와서 화면을 띄워준다 위에 Navhost는 해당 문자열(shoppinglistscreen, locationscreen)로 route할때 어떤 페이지로 이동해야하는지 나타내준다 따라서 composable로 되어있는 것은 페이지로 라우팅이되고 dialog로 되어있는것은 팝업창으로 라우팅이 된다
사전 준비 사항
코틀린 권한 설정
작업을 하기 전에 미리 필요한 것들을 Manifest 파일에 선언해두고 사용해야 가상 머신에서 사용할 수있다.
의존성 파일 선언

필요한 의존 파일들을 미리 선언해두고 동기화 시켜야 구글 맵에 필요한 함수나, retrofit(restful api를 도와주는 객체)에 필요한 함수 등을 IDE에서 사용할 수 있다.
Retrofit 객체

정해져있는 구조니까 잘 이해하고 외우면 된다 Builder를 통해 Retrofit 객체를 만들고, BaseUrl로 디폴트 url설정을 한뒤 addConverterFactory로 변환해줄 함수를 붙여 사용하는 꼴이다 그리고 build를 통해 최종 객체를 만들어낸다 그러고 난뒤 retrofit.create을 통해 내가 사용할 객체로 변환을 해주어 사용해준다.
그리고 object는 싱글톤객체로 사용할때에 사용한다고 한다 → 따라서 database객체나 위와 같이 변환에 사용하는 객체에 자주 사용한다
코드 내 데이터 클래스

API 인터페이스

위와 같이 suspend fun을 통해 GET 을 수행할수 있다. 그러면 GET에 설정한 기본값에 latlng와 apikey가 붙은 url이 생성되어 get request를 하게되고, 그에 대한 반환값으로 GeocodingResponse를 주게된다
그리고 각각 정보를 여러개 줄수 도 있기때문에 json 양식이 리스트로 되어있고, 그 내부 요소의 타입이 GeocodingResponse이기 때문에 내부의 formatted_address 속성만 매핑이 된다. (존재하지 않는 속성은 매핑되지 않는다)
최종적으로
최종적으로 클릭한 location을 list에 반영하는 것이 최종 목표이기 때문에 맵에 Marker를 눌렀을때 onclick 이벤트로 값을 전달하고, locationData를 수정하려면 viewModel을 통해 수정이 이루어져야한다 따라서 LocationDataViewModel은 다음과 같다

아까 말했다시피 create을 하면 GeocodingApiService 클래스의 객체가 만들어지고 해당 객체에는 getAddressFromCoordinate함수를 실행할 수 있다 해당 함수에 latlng와 apikey를 넘겨주어 url을 통해 get request를 하고 원하는 정보를 google map으로부터 알아올 수 있다.
그리고 이전 공부자료에서 간략하게 설명했지만 viewModelScope 내에서 launch하는 이유는 (launch는 비동기적으로 실행시켜주는 함수) viewModel 이 메모리에서 사려졌을 때 viewModelScope 내의 모든 코루틴 을 자동으로 취소시켜주게 된다 자동으로 취소시키지 않으면 코루틴만을 위한 메모리가 따로 할당되어있는 것이므로 메모리 누수가 발생하게 된다
따라서 코루틴(비동기작업) 을 할때에는 scope를 정해주고 실행 시켜주는 것이 좋다
여튼 그렇게 location정보를 갱신하고 화면에 띄워주는 composable함수 내부에서 item 요소를 수정, 추가하게 되면 Location이 잘 업데이트 되는것을 볼수 있다
결과
````ad-white
![[Pasted image 20241030205237.png|350]]
````
````ad-white
![[Pasted image 20241030205255.png|350]]
````
````ad-white
![[Pasted image 20241030205316.png|350]]
````