【问题标题】:ViewModel with Asynchronous Data Load and SavedStateHandle具有异步数据加载和 SavedStateHandle 的 ViewModel
【发布时间】: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


【解决方案1】:

默认情况下,按照 Google 的预期方式(以及在 onStart 中尝试重新获取的方式),您会将 StarWarsApiService.getFilms 设为 suspend fun,而不是基于回调,然后您可以这样做

class FilmsViewModel(private val savedStateHandle: SavedStateHandle): ViewModel() {
    val filmsLiveData = liveData {
        emit(loadFilms())
    }
}

但是您正在寻找的是一个常规的viewModelScope.launch {,它将检索到的数据保存在MutableLiveData 中,或者保存到本地存储(房间)中,这将暴露一个LiveData&lt;List&lt;T&gt;&gt;,这将被片段观察到。

SavedStateHandle 不是用于数据,而是用于状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2013-02-24
    • 1970-01-01
    • 2016-11-03
    • 2017-09-06
    • 2011-06-24
    相关资源
    最近更新 更多