이전 글에서 ViewModel이 기기의 설정(configuration) 변경에도 살아있는 것을 확인했다.
그리고, 이번에는 화면에 보여줄 데이터를 넣고, 그 데이터를 작업하는 코드를 ViewModel 안에 구현한다.
ViewModel은 프래그먼트, 액티비티, 또는 뷰들의 참조를 절대 포함해서는 안된다.
이 친구들은 기기의 configuration이 변경되면 살아남지 못하기 때문이다.
우리가 ViewModel을 추가하기 전에는 화면 회전 등의 기기의 설정 변경이 있으면
프래그먼트는 부셔졌다 다시 만들어졌고, 데이터는 소실되었다.
하지만 ViewModel을 추가하고 프래그먼트의 데이터를 ViewModel로 이동한 뒤에는
프래그먼트에서 보여줄 모든 데이터는 이제 ViewModel 안에 있고,
앱이 기기의 설정 변경을 거쳐도 ViewModel은 살아있고 데이터는 유지된다.
1. 데이터 필드와 데이터 처리를 ViewModel로 옮기기
프래그먼트에 있던 데이터 필드와 메소드를 GameViewModel로 옮긴다.
예제에서는 word, score, wordList의 데이터 필드를 옮기고 word와 score는 private으로 선언하지 말라고 한다.
또한, binding 변수도 옮기지 말라고 한다. 위에서 말했듯이 뷰에 대한 참조를 가지면 안되기 때문이다.
resetList()와 nextWord() 메소드는 데이터에 대한 처리를 하는 메소드이기에 ViewModel로 옮겨준다.
그 다음, 원래 프래그먼트의 onCreateView() 안에 있던 메소드 호출을 ViewModel의 init(초기화) 블럭으로 옮긴다.
이 메소드들이 init 블럭에 있어야 하는 이유는 프래그먼트가 다시 만들어질 때마다
단어 리스트를 초기화하는 것이 아니라, ViewModel이 만들어질 때 초기화해야하기 때문이다.
GameFragment 안에 있는 onSkip()과 onCorrect() 이 두 클릭 핸들러는
데이터를 처리하는 코드와 UI를 업데이트하는 코드를 포함하고 있다.
UI를 업데이트하는 코드는 프래그먼트 안에 남아있어야 하지만,
데이터를 처리하는 코드는 ViewModel로 옮길 필요가 있다.
따라서 Codelab에서 위 내용을 처리한 방법은 이렇다.
onSkip()과 onCorrect() 메소드를 GameFragment에서 GameViewModel로 복사한다.
GameViewModel에서 두 메소드는 private이 아니어야 한다.
왜냐하면, 이 메소드들을 프래그먼트에서 참조할 것이기 때문이다.
2. Fragment에 있는 데이터 필드와 클릭 핸들러에 대한 참조를 업데이트한다.
GameFragment에서 onSkip()과 onCorrect() 메소드를 업데이트한다.
점수를 업데이트하기 위해 코드를 제거하고 대신 onSkip()과 onCorrect() 메소드를 viewModel에서 호출한다.
왜냐하면, nextWord() 메소드를 ViewModel로 옮겼기 때문이다.
GameFragment에서 onSkip()과 onCorrect() 메소드의 nextWord() 호출을
updateScoreText()와 updateWordText()로 치환해준다.
치환해준 메소드들은 화면에 데이터를 보여준다.
GameFragment에서 score와 word 변수를 GameViewModel 변수를 사용하도록 업데이트한다.
왜냐하면, 이 변수들은 이제 GameViewModel 안에 있기 때문이다.
그리고 GameViewModel에서 nextWord() 메소드 안의 updateWordText()와 updateScoreText() 메소드를 지운다.
이 메소드들은 이제 GameFragment 안에서 호출되기 때문이다.
(사실, 위에서 언급하지 않았지만 Codelab에서 제공한 코드를 봤을 때 가장 이해가 안됐던 부분이
ViewModel에서 존재하지 않는 메소드(updateWordText()와 updateScoreText())를 호출하는 부분이었다.)
https://developer.android.com/codelabs/kotlin-android-training-view-model#5
'Android' 카테고리의 다른 글
Codelab으로 ViewModel 알아보기 - 4. Use a ViewModelFactory(完) (0) | 2023.01.13 |
---|---|
Codelab으로 ViewModel 알아보기 - 3. Implement click listener (0) | 2023.01.03 |
Codelab으로 ViewModel 알아보기 - 1. Create the ViewModel (0) | 2022.12.15 |
Android APK 소개 (0) | 2022.11.15 |
Android Studio Github Push Error 해결 (0) | 2022.09.19 |