#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 я думаю, что в моем случае это нарушает принципы чистой архитектуры. Не могли бы вы предоставить более подробную информацию о своем ответе?