LiveData.getValue () не равно NULL, но LiveData.observe имеет значение NULL - PullRequest
0 голосов
/ 02 августа 2020

У меня странная проблема с моим кодом.

Сценарий ... У меня есть список данных, я получаю их в Viewmodel и наблюдаю из фрагмента. Когда я впервые открываю свой фрагмент, все работает нормально. Но когда я возвращаюсь из другого фрагмента, LiveData не равно нулю. Итак, я проверил вот так:

if(liveData.getUser().getValue()!= null){

//here getName() does not null and I get the value from liveData      

println(liveData.getUser().getName()) //this work
 
 liveData.getUser().observe(lifeCycleOwner(),
 Observer { user: User? ->{
  //Here LiveData is null
       }
     })

 }
 else{
         liveData.initiate()
         LiveData.getUser.observe(//same as above)
    }

Я наблюдаю в onViewCreated () . Я не знаю, почему LiveData.getValue () не имеет значения null, но LiveData.observe возвращает значение null.

Может ли кто-нибудь помочь мне с этим?

Edit ... Это мой UserViewmodel.class

 class UserViewModel : ViewModel(){
       private var userLiveData : LiveData<User>?= MutableLiveData<>()
      fun initiate (){
          userLiveData = UserRepository.getUserData()
      }
      fun getUser() : LiveData<User>{
        Log.e("get called")
        return userLiveData
       }
 }

Edit 2 Это мой UserRepository.class

 class UserRepository {
     private var userData : MutableLiveData<User>?= null
     fun getUserData(): LiveData<User>{
          retrieveUser()
          return userData
     }
     fun retrieveUser (){
          val names = arrayOf("user1","user2","user3","user4","user5")
        for(name :String in names){
             user = User()
             user.setName(name)
             userData.value = user
          }
      }
 }

1 Ответ

0 голосов
/ 02 августа 2020

вывод

I/System.out: user1
I/System.out: user2
I/System.out: user3
I/System.out: user4
I/System.out: user5

Упрощенный чистый код Примечание: прочтите комментарии к коду для понимания

View (Fragment or Activity)

val userViewModel: UserViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    userViewModel.getUser().observe(this, Observer {
        for (user in it) {
            println(user.name)
        }
    })

ViewModel

class UserViewModel : ViewModel(){
private var userRepository = UserRepository()
private var userLiveData = MutableLiveData<ArrayList<User>>()

//init block where initialise happens
init {
    //retrieve users and set in user live data
    userLiveData.postValue(userRepository.retrieveUsers())
}
fun getUser() : MutableLiveData<ArrayList<User>> {
    //observe user live date in view
    return userLiveData
}

override fun onCleared() {
    super.onCleared()
    //clear live data
    userLiveData.postValue(null)
}
}

Репозиторий

class UserRepository {
/**
 * retrieve users as ArrayList
 */
fun retrieveUsers (): ArrayList<User> {
    val names = arrayOf("user1","user2","user3","user4","user5")
    val list = ArrayList<User>()
    for(name :String in names){
        val user = User()
        user.name = name
        list.add(user)
    }
    return list
}
}
...