이전 포스팅에서 Transformations를 사용하여 LiveData를 다른 LiveData로 변화시켰다.
이번 포스팅은 Transformations 내부에서 사용한 MediatorLiveData에 대해 알아본다.
https://developer.android.com/reference/android/arch/lifecycle/MediatorLiveData
MediatorLiveData는 중재자 LiveData로,
여러가지 LiveData들의 변화를 감지하여 하나의 값을 방출한다.
예를들어 다수의 입력필드가 있고, 입력필드들의 값을 검증하여 어떤 버튼이 활성화된다고 해보자.
이 경우, 검증해야할 모든 LiveData의 값을 구독하여 버튼을 활성화 시켜야 될까?
그럼 너무 지저분해지고, 실수할 가능성도 높아진다.
이럴때 MediatorLiveData를 사용하면 손쉽게 해결할 수 있다.
아래 예시 코드를 보자.
class MyViewModel: ViewModel() {
private val _input1: MutableLiveData<String> = MutableLiveData()
private val _input2: MutableLiveData<String> = MutableLiveData()
private val _input3: MutableLiveData<String> = MutableLiveData()
private val _buttonEnable: MediatorLiveData<Boolean> = MediatorLiveData().apply {
value = false
addSource(_input1) {
value = it.isNotEmpty() && !_input2.value.isNullOrEmpty() && !_input3.value.isNullOrEmpty()
}
addSource(_input2) {
value = it.isNotEmpty() && !_input1.value.isNullOrEmpty() && !_input3.value.isNullOrEmpty()
}
addSource(_input3) {
value = it.isNotEmpty() && !_input1.value.isNullOrEmpty() && !_input2.value.isNullOrEmpty()
}
}
val buttonEnable: LiveData<Boolean> = _buttonEnable
}
class NameActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.buttonEnable.observe(this) {
myButton.isEnabled = it
}
}
}
3개의 입력필드가 있다고 가정해보자.
그리고 3개의 입력필드가 모두 입력값이 있을때 버튼이 활성화 되어야 하는 조건이 있다.
MediatorLiveData에 입력 필드들의 LiveData를 Source로 등록한다.
그리고 각 Source의 변화가 감지되었을 때 MediatorLiveData의 value를 어떻게 변화시킬건지 작성한다.
이렇게 되면, 각 Source가 변화되었을 때 마다 MediatorLiveData의 값이 변하고,
Activity/Fragment에서는 이 MediatorLiveData만 관찰하여 버튼의 활성화 상태를 변경할 수 있다.
이처럼 다수의 LiveData의 값을 감지하여 하나의 값으로 정제해야 하는 경우에,
MediatorLiveData는 매우 활용도가 높다.
'개발 > Android' 카테고리의 다른 글
Android Compose - LazyColumn의 최하단 스크롤 이벤트 감지하기 (0) | 2023.06.10 |
---|---|
Kotlin Multiplatform Mobile(KMM) - Start! (0) | 2023.04.05 |
Android - Deep dive into LiveData - 3. Transformations(map, switchMap) (0) | 2023.01.28 |
Android - Deep dive into LiveData - 2. setValue vs postValue (0) | 2023.01.21 |
Android - Deep dive into LiveData - 1. LiveData가 무엇인가요? (0) | 2023.01.21 |