Android. Не получается обновить данные с использованием SwipeRefreshLayout + LiveData
В приложении используются принципы Clean Acrhitecture. Данные собираются и эмитятся в data слое. В моем случае используется LiveData Builder + Coroutines. Observer установлен во фрагменте.
После запуска приложения данные присваиваются _profile переменной в ProfileFragmentViewModel. Затем они отображаются в Resource.Status.SUCCESS блоке.
Когда я использую viewModel.refreshProfile(), это не дает ожидаемого эффекта, переменная _profile в ProfileFragmentViewModel не обновляется.
Таким образом, мне необходимо обновить данные после вызова метода refreshProfile. Пожалуйста, посмотрите мой код ниже и подскажите что нужно изменить, что бы добиться желаемого результата. Код упростил до минимума, но суть осталась та же.
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...
}
}