LiveData. Observer не видит новых данных после обновления из API или DB

#android #kotlin #observable #android-livedata #swiperefreshlayout

#Android #kotlin #наблюдаемый #android-livedata #swiperefreshlayout

Вопрос:

Мне нужно обновить данные с помощью SwipeRefreshLayout and LiveData . Сначала данные загружаются и присваиваются _profile переменной в ProfileFragmentViewModel . Затем отображается в Resource.Status.SUCCESS блоке. Здесь нет проблем.

Когда я использую viewModel.refreshProfile() , видимого эффекта нет, то есть данные не присваиваются _profile переменной в ProfileFragmentViewModel .

Я хочу, чтобы новые данные загружались в наблюдаемый. Пожалуйста, скажите мне, в чем моя ошибка и как ее исправить. Спасибо

ProfileFragment.kt

 class ProfileFragment : DaggerFragment() {

    @Inject
    lateinit var viewModel: ProfileFragmentViewModel

    private val observer = Observer<Resource<Profile>> {
        when (it.status) {
            Resource.Status.LOADING -> {
                Timber.i("Loading...")
            }
            Resource.Status.SUCCESS -> {
                Timber.i("Success: %s", it.data)
                srl_profile.isRefreshing = false
            }
            Resource.Status.ERROR -> {
                Timber.i("Error: %s", it.message)
                srl_profile.isRefreshing = false
            }
        }
    };

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_profile, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        srl_profile.setOnRefreshListener {
           srl_profile.isRefreshing = true
           viewModel.refreshProfile()
        }
        viewModel.getProfileLive().observe(viewLifecycleOwner, observer)
    }
} 
 

ProfileFragmentViewModel.kt

 class ProfileFragmentViewModel @Inject constructor(
    private val profileUseCase: ProfileUseCase
) : ViewModel() {
    private val _profile = profileUseCase.getProfile()
  
    fun refreshProfile() {
       _profile = profileUseCase.getProfile()
    }
    fun getProfileLive() = _profile
} 
 

ProfileUseCase.kt

 class ProfileUseCase @Inject constructor(
    private val profileRepository: ProfileRepository
) {

    fun getProfile(): LiveData<Resource<Profile>> {
        return profileRepository.getProfile()
    }
}
 

ProfileRepository.kt

 class ProfileRepository @Inject constructor(   
   private val loginUserDao: LoginUserDao,   
   private val profileDao: ProfileDao   
) {

fun getProfile(): LiveData<Resource<Profile>> =
    liveData(Dispatchers.IO)
    {
        emit(Resource.loading(data = null))

        val profile = profileDao.getProfile()

        // Emit Success result...
    }
}
 

Комментарии:

1. Вы должны использовать LiveData в своем классе ViewModel

2. @Sarah я думаю, что в моем случае это нарушает принципы чистой архитектуры. Не могли бы вы предоставить более подробную информацию о своем ответе?