Kotlin/Android
LiveData 변환하기
green_ne
2021. 10. 27. 15:43
- LiveData에 저장된 값을 변경하여 저장하고 싶은 경우
- 다른 LiveData 인스턴스를 반환해야 하는 경우
이러한 경우 Lifecycle 패키지에 Transformations 클래스를 사용한다.
# Transformations.map()
LiveData에 저장된 값에 map으로 함수를 적용한 값을
다운스트림으로 전파한다.
val userLiveData: LiveData<User> = UserLiveData()
val userName: LiveData<String> = Transformations.map(userLiveData) { user ->
"${user.name} ${user.lastName}"
}
# Transformations.switchMap()
LiveData에 저장된 값에 ㅌ으로 함수를 적용한 값을
wrapping을 해제하여 다운스트림으로 전달한다.
다음 예제와 같이 switchMap함수의 마지막 줄에는 LiveDat<T>를 반환해야 한다.
private fun getUser(id: String): LiveData<User> {
...
}
val userId: LiveData<String> = ...
val user = Transformations.switchMap(userId) { id -> getUser(id) }
예를 들어,
ViewModel에서 저장된 LiveData의 변환으로 코드를 가져오는 경우.
// ! 하지 말아할 방식
class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {
private fun getPostalCode(address: String): LiveData<String> {
return repository.getPostCode(address)
}
}
// 추천 방식
class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {
private val addressInput = MutableLiveData<String>()
// 다음과 같이 Transformations.switchMap()을 사용하여 값을 가져온다
val postalCode: LiveData<String> = Transformations.switchMap(addressInput) {
address -> repository.getPostCode(address) }
private fun setInput(address: String) {
addressInput.value = address
}
}
++
자체 변환을 구현하려면, 다른 LiveData를 받아 이벤트 처리할 수 있는 MediatorLiveData 클래스를 사용하면 된다.
MediatorLiveData는 자신의 상태를 소스 LiveData에 곧바로 전파한다.
반응형