이번 코드랩에서는 AAC의 ViewModel 클래스를 알아볼 것이다.
1페이지를 천천히 보다보니 ViewModel은 factory 디자인 패턴을 사용하고 있다는 것을 알 수 있다.
ViewModel을 instantiate(인스턴스화)하려면 ViewModelFactory를 사용하라고 한다.
다음 페이지부터는 주어지는 샘플 앱이 있고,
여기서 문제를 정의한 후 문제 해결을 위해 어떤 단계를 밟아서 처리할 것인지 안내하고 있다.
1. GameViewModel 클래스(ViewModel을 상속하는) 추가하기
먼저 ViewModel을 사용하기 위해서는 모듈 수준의 build.gradle에서 Gradle dependency를 추가해주어야 한다.
//ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
또, 주의사항이 적혀있는데 가장 최근 버전의 라이브러리를 사용하면 예상대로 앱이 컴파일될 것인데
만약 그렇지 않다면 위에 적어둔 2.2.0의 버전으로 되돌려보라고 한다.
그리고 GameViewModel 클래스를 생성하고 제대로 클래스가 생성되는지 확인하기 위해 로그를 남긴다.
(여기서 init 블럭은 내가 사용해 본 적이 없어서 검색해보았더니,
아래의 Log.i 함수를 실행한 것처럼 주 생성자와 달리 코드를 포함할 수 있었다.)
class GameViewModel : ViewModel() {
init {
Log.i("GameViewModel", "GameViewModel created!")
}
}
그리고 ViewModel 클래스의 onCleared() callback을 override해 위처럼 로그를 추가하라고 한다.
override fun onCleared() {
super.onCleared()
Log.i("GameViewModel", "GameViewModel destroyed!")
}
다음은 만든 GameViewModel과 Fragment를 연결(Associate)한다.
GameFragment 클래스에 GameViewModel 형으로 멤버 변수(필드)를 추가한다.
private lateinit var viewModel: GameViewModel
ViewModel을 초기화한다.
여기서 가장 위에 적었던 팩토리 디자인 패턴을 사용하는 이유가 나와있는데,
원래 화면 회전같은 configuration이 변경될 때마다 프래그먼트같은 UI controller는 다시 만들어지는데(re-created)
ViewModel을 ViewModel class를 사용해 인스턴스화하면 프래그먼트가 다시 만들어질 때마다 만들어진다.
(원래 ViewModel은 기기의 configuration이 변경되어도 인스턴스가 살아있어야 한다)
ViewModelProvider.get() 메소드를 사용하고 연결된 프래그먼트의 context와 GameViewModel을 전달한다.
Log.i("GameFragment", "Called ViewModelProvider.get")
viewModel = ViewModelProvider(this).get(GameViewModel::class.java)
'Android' 카테고리의 다른 글
Codelab으로 ViewModel 알아보기 - 3. Implement click listener (0) | 2023.01.03 |
---|---|
Codelab으로 ViewModel 알아보기 - 2. Populate the ViewModel (0) | 2022.12.23 |
Android APK 소개 (0) | 2022.11.15 |
Android Studio Github Push Error 해결 (0) | 2022.09.19 |
Android Developer Roadmap 2022 version (0) | 2022.08.19 |