LiveData 변환하기

2021. 10. 27. 15:43Kotlin/Android

- 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에 곧바로 전파한다.

반응형

'Kotlin > Android' 카테고리의 다른 글

OkHttp 와 Retrofit 차이  (0) 2021.11.06
Android Studio에서 SHA-1키 얻는 방법  (0) 2021.10.31
MediatorLiveData로 LiveData 병합하기  (0) 2021.10.27
LiveData 생성하기  (0) 2021.10.26
LiveData 란?  (0) 2021.10.26