아래는 코모스튜디오가 직접 만든 무료 앱이에요(한 번만 봐주세요 ^^)
Repository의 Data가 변경 되었을 때 UI에 알리기 위해서는 ViewModel이 관찰을 하고 있어야 한다.
UI(V)는 보통 onCreate()에서 VM을 생성하고, VM은 Repository를 생성한 뒤 M과 Dao를 통해 연결 되는데, 이 Dao를 LiveData로 구성하면 ViewModel이 지켜 볼 수(obsever) 있게 된다.
연결(MVVM)
onCreate/onCreateView 실행이 되면서 viewModel 생성 작업과 이후 연결 작업이 실행 된다.
Fragment.kt
private val plantDetailViewModel: PlantDetailViewModel by viewModels {
InjectorUtils.providePlantDetailViewModelFactory(requireActivity(), args.plantId)
}
ViewModel.kt
val plant = plantRepository.getPlant(plantId)
Repository.kt
fun getPlant(plantId: String) = plantDao.getPlant(plantId)
Dao.kt
@Query("SELECT * FROM plants WHERE id = :plantId")
fun getPlant(plantId: String): LiveData<Plant>
관찰(Observe)
onCreate/onCreateView에서 아래와 같이 Observer를 등록해서 이후 작업을 처리 한다.
val plantObserver = Observer<Plant> {
//데이터 변경 시, 해야할 View 작업들
}
//옵져버 등록
plantDetailViewModel.plant.observe(viewLifecycleOwner, plantObserver)
위 부분을 코틀린이 아닌 자바로 할 경우에는
final Observer<Plant> plantObserver = new Observer<Plant>(){
@Override
public void onChanged(@Nullable final Plant plant){
//UI 작업
}
}
viewModel.plant.observe(this, plantObserver)
만약, 위와 같이 Observer를 등록하지 않고, onCreate에서 view에 viewModel.plant.value? 작업으로 get을 하려고 하면 null 값이 발생한다.
왜냐하면, View는 ViewModel을 생성하고, 레파지토리를 생성하고 Dao, LiveData 를 생성해서 Data를 LiveDatad에 set 하는 작업을 백그라운드에서 작업을 하고 있는데, 실제 UI의 LifeCycle은 변경되어 onCreate가 끝나 버렸기 때문이다. 즉, LifeCycle이 변경되더라도 Data의 변경 사항이 발생하면 UI에 알려서 직접 UI를 변경 할 수 있는 연결 고리를 만드는 것이다.
' [안드로이드 공부] > 코틀린' 카테고리의 다른 글
null cannot be cast to non-null type androidx.appcompat.widget.appcompatimagebutton (0) | 2020.08.22 |
---|---|
smart cast to is impossible because is a mutable property that could have been changed by this time (0) | 2020.08.07 |
코틀린 생성자와 위임 (0) | 2020.07.27 |
추상클래스(abstract)와 인터페이스(interface) (0) | 2020.07.27 |
코틀린 Scope; apply, also, run, with, let (0) | 2020.07.23 |
모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다. |
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요. |