У меня есть пример использования:
- Открыть приложение + отключить сеть -> ошибка отображения
- Выйти из приложения, затем включить сеть, затем снова открыть приложение
Ожидается: данные загрузки приложения
Фактически: ошибка отображения приложения, означающая, что ошибка состояния кэшируется, liveData не генерируется
Класс репозитория
class CategoryRepository(
private val api: ApiService,
private val dao: CategoryDao
) {
val categories: LiveData<Resource<List<Category>>> = liveData {
emit(Resource.loading(null))
try {
val data = api.getCategories().result
dao.insert(data)
emit(Resource.success(data))
} catch (e: Exception) {
val data = dao.getCategories().value
if (!data.isNullOrEmpty()) {
emit(Resource.success(data))
} else {
val ex = handleException(e)
emit(Resource.error(ex, null))
}
}
}
}
Класс ViewModel
class CategoryListViewModel(
private val repository: CategoryRepository
): ViewModel() {
val categories = repository.categories
}
Класс фрагмента, где LiveDate obsever
viewModel.apply {
categories.observe(viewLifecycleOwner, Observer {
// live data only trigger first time, when exit app then open again, live data not trigger
})
}
не могли бы вы помочь мне объяснить, почему живые данные не запускаются в этом сценарии использования и как исправить? Большое спасибо
Обновление
Я решил вышеуказанную проблему, заменив val categories
на func categories()
в классе репозитория. Однако я не понимаю и не могу объяснить, почему он правильно работает с func
, но не с val
.