Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코틀린
- 싱글톤
- Design Pattern
- 프로토타입 패턴
- Abstract Factory
- PrototypePattern
- Singleton
- a
- Functional Programming
- Kotlin
- ㅋㅁ
- designPattern
- 추상팩토리패턴
- F
- factory method
- 디자인패턴
- El
- builderPattern
- 추상 팩토리
- 함수형프로그래밍
- 옵저버 패턴
- 팩토리 메소드
- ㅓ
- Observer Pattern
- 디자인패턴 #
- r
- 빌터패턴
Archives
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
ViewModel (Fragment간 데이터 공유 및 통신하기) 본문
ViewModel이 없이 하나의 Activity에서 일반적으로 여러 개의 Fragment와의 데이터를 공유하고 전달하기 위해서는
Activity가 인터페이스를 구현하고 그 인터페이스의 참조(context)를 각 Fragment에 넘겨준 후 호출시키는 방법으로 통신을 하는 것이 기본적이다.
하지만 두 fragment가 모두 인터페이스 설명을 정의해야 하고 소유자 Activity가 두 fragment를 함께 결합해야 하므로 이 사례는 간단히 처리할 수 있는 작업이 아닙니다. 또한 두 fragment는 모두 다른 fragment가 아직 생성되지 않았거나 표시되지 않은 시나리오도 처리해야 합니다.
ViewModel을 사용하면 이러한 Activity 및 Fragment 간 데이터의 공유 및 통신이 쉬어지고 코드가 많이 간결해진다.
예제)
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Item>()
fun select(item: Item) {
selected.value = item
}
}
class MasterFragment : Fragment() {
private lateinit var itemSelector: Selector
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
itemSelector.setOnClickListener { item ->
// Update the UI
}
}
}
class DetailFragment : Fragment() {
// Use the 'by activityViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
// Update the UI
})
}
}
두 Fragment모두 자신이 포함된 Activity을 검색합니다.
kotlin : private val model: SharedViewModel by activityViewModels()
java : model = new ViewModelProvider(requireActivity()). get(SharedViewModel.class);
그러면 각 Fragment ViewModelProvider를 가져올 때 이 Activity으로 범위가 지정된 동일한 SharedViewModel 인스턴스를 받습니다.
장점
- Activity는 아무것도 하지 않아도 되거나, 이 커뮤니케이션에 관해 어떤 것도 알 필요가 없습니다.
- 프래그먼트는 SharedViewModel 외에 서로 알 필요가 없습니다.
- Fragment 중 하나가 사라져도 다른fragment는 계속 평소대로 작동합니다.
- 각 Fragment는 자체 수명 주기가 있으며, 다른 Fragment 수명 주기의 영향을 받지 않습니다. 한 프래그먼트가 다른 프래그먼트를 대체해도, UI는 아무 문제없이 계속 작동합니다.
'Android Jetpack Architecture > ViewModel' 카테고리의 다른 글
ViewModel 사용시 주의해야 할 점. (0) | 2020.08.21 |
---|---|
ViewModel로 Loader 대체 하기 (0) | 2020.08.21 |
ViewModel (생명주기) (0) | 2020.08.20 |
ViewModel 구현 (0) | 2020.08.18 |
ViewModel 개요 (0) | 2020.08.18 |