【发布时间】:2021-01-25 22:40:14
【问题描述】:
我是 ViewModel 的新手,我正在尝试找出将 SavedStateHandle 与从 API 异步加载数据结合使用的最佳做法。
我的用例是我的 ViewModel 数据应该从 API 加载一次,然后我希望 SavedStateHandle 保存该数据,因此如果我回到片段,它不会执行该 API重拨。我只希望在 UI 中的下拉刷新机制上从 API 刷新数据,否则它应该使用 SavedStateHandle 数据。
我发现了很多使用其中之一的示例(异步数据加载或SavedStateHandle,但不能同时使用两者。
这是我不使用SavedStateHandle的初始代码
class FilmsViewModel(private val savedStateHandle: SavedStateHandle): ViewModel() {
private val filmsLiveData : MutableLiveData<List<Film>?> by lazy {
MutableLiveData<List<Film>?>().also {
loadFilms()
}
}
fun getFilms(): LiveData<List<Film>?> {
return filmsLiveData
}
fun loadFilms() {
Log.d("FilmsViewModel", "loadFilms")
StarWarsApiService.getFilms(object: FilmsCallback {
override fun success(films: List<Film>?) {
filmsLiveData.value = films
}
}, object: ErrorCallback {
override fun error(error: ApiError) {
// TODO
}
})
}
}
有什么想法吗?
【问题讨论】:
-
你是如何“回到片段”的?如果不是从 API 加载,是什么阻止您检查 SavedStateHandle 是否包含给定数据?...我敢打赌 SavedStateHandle 不是您认为的...
-
@Selvin 这正是我感到困惑的地方。我在哪里执行检查数据 SavedStateHandle 是否包含给定数据
-
您可以在
also中执行此操作,并将值放入success...
标签: android android-livedata android-architecture-components android-viewmodel