본문

Shared ViewModel

도입

이번 포스팅에서는 fragment 사이에 ViewModel을 통해 데이터를 공유하는 방법에 대해 정리할 예정이다.
공식 문서에 있는 내용을 실습하고 확인할 예정이다. 아래 문서 참고

https://developer.android.com/topic/libraries/architecture/viewmodel#sharing


 

실습

Step1. 공통 ViewModel 생성

1
2
3
4
5
6
7
8
class CommonViewModel : ViewModel() {
    val liveData = MutableLiveData<MutableList<String>>()
    var position: Int = -1
 
    init {
        liveData.value = (0..50).map { "$it" }.toMutableList()
    }
}
cs

Step2. 2개 Fragment 생성

FirstFragment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class FirstFragment : Fragment() {
 
    companion object {
        fun newInstance() = FirstFragment()
    }
 
    private lateinit var viewModel: CommonViewModel
    private lateinit var controller: FirstController
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = activity?.run {
            ViewModelProviders.of(this)[CommonViewModel::class.java]
        } ?: throw Exception("Invalid Activity")
    }
    // ...
}
cs

SecondFragment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class SecondFragment : Fragment() {
 
    companion object {
        fun newInstance() = SecondFragment()
    }
 
    private lateinit var viewModel: CommonViewModel
    private lateinit var controller: SecondController
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = activity?.run {
            ViewModelProviders.of(this)[CommonViewModel::class.java]
        } ?: throw Exception("Invalid Activity")
    }
    // ...
}
cs

 

Step3. Fragment에서 사용되는 ViewModel의 주소값 확인

위 화면처럼 FirstFragment와 SecondFragment 모두 동일한 ViewModel을 사용하고 있는 것을 알 수 있다.

 

Step4. 내부 코드 확인

내부 코드를 확인해보면 ViewModel은 hashMap으로 관리되고 있고 ViewModel이 존재하면 해당 ViewModel을 반환한다.

https://developer.android.com/reference/android/arch/lifecycle/ViewModelProvider.html#get(java.lang.Class%3CT%3E)


스크린 샷

 

 

#shared viewModel #viewModel #viewModel 공유 #공유

공유

댓글