공부/Android

LiveData 의 value가 null을 반환할때

데자와 맛있다 2023. 5. 5. 20:20
MutableLiveData<MutableList<Photo>>

이런 타입의 라이브데이터를 사용하고싶었음

레포지토리 패턴을 사용함

레포지토리에서 아래와 같이 라이브데이터를 반환하는 함수를 만들었음

그리고 galleryDao는 로컬 DB에 접근해서 데이터 가져오는애임 아래와 같다 (room을 사용함)

암튼 이렇게 하고 viewModel에서 이 liveData를 업데이트하는 함수를 만듦

getPhotoFromLocal이라는 함수에서 레포지토리를 이용해가지고 라이브데이터를 반환받고 value꺼내서 값 업데이트 하고싶었음

근데 이렇게 하니깐 반환된 라이브데이터의 value가 null임

근데 반환된 라이브데이터는 null아님

찾아보니

https://github.com/android/architecture-components-samples/issues/44

 

Using getValue() on LiveData returns null with Room · Issue #44 · android/architecture-components-samples

I have a POJO set up for use with Room and retrofit @TypeConverters(DateConverter.class) @Entity(indices = {@Index("code")}) public class HealthcareCenter { @PrimaryKey @SerializedName("id") privat...

github.com

라이브데이터는 옵저버들 한테 값이 바뀌었다고 알려주는애

따라서 안에있는 값 자체가 필요한거면 이런식으로 반환하면 안된다는뜻인듯

명료하게 알지는 못하겠는데 대강 왜 안되는건지 알겠음. .. . . 

그니간 라이브 데이터 객체 자체가 얘의 value가 변경되면 알림을 보내는앤데 걔의 value를 내놔라 하니깐 

아직 뭐 값 가져온것도 없는데 value내놔라 해서 안되는거인듯?

암튼 Dao에서 livedata로 가져와서 value를 꺼낸다는것이 잘못된 설계인듯

 

그래서 Dao에서 suspend해서 값을 가져오기로함

 

위처럼 바꾸니깐 잘됨

 

 

fun getPhotoFromLocal(){
   viewModelScope.launch {
      val newPhotos = GalleryRepository.get().getPhotos()
      
      for(element in newPhotos){
         _mutableLiveDataList.value?.add(element)
      }
   }
}

근데 이건 왜 안되는거임?

해보니깐 value를 통째로 갈아줘야되는듯함