0

我按照下一页中的说明创建了一个 viewModel,但是SavedStateHandle当我关闭应用程序并再次打开它时它不起作用。

这是页面:

ViewModel 的已保存状态模块

这是我的视图模型类:

class UserViewModel(private val state : SavedStateHandle) : ViewModel(){
    val userId: LiveData<String> by lazy {
         state.getLiveData("userId")
    }
    fun setUserId(userId : String) {
        state["userId"] = userId
    }
    val user : User by lazy {
        User("")
    } }

这是我在活动中使用 viewModel 的方式。

val userViewModel :  UserViewModel by viewModels()

我什至在我的活动中尝试过这个,但这也不起作用!

val userViewModel: UserViewModel by viewModels {
            SavedStateViewModelFactory(
                application,
                this
            )

我应该怎么做才能将数据保留在SavedStateHandle? 我的意思是,打开应用程序后state仍然是空的。

4

2 回答 2

1

- - 编辑: - -

系统似乎分两步释放内存,而 SavedStateHandle 仅在第一步中持久化数据:

  1. 系统终止进程。应用程序保留在最近的屏幕中。数据由 SavedStateHandle 持久化(或者在 EditText 的情况下由 savedInstanceState 中的视图持久化,请参阅代码实验室)。
  2. 系统完成应用程序。应用程序从最近的屏幕中删除。SavedStateHandle 中的数据消失了,就像用户完成了应用程序一样。

结论:如果您想在第 2 步中保留数据,请使用比 SavedStateHandle 更持久的东西。

----结束编辑----

我做了与代码实验室(https://developer.android.com/codelabs/android-lifecycles#6)类似的事情。

正如 OP 所描述的,将 LiveData 存储在 SavedStateHandle 中(对我而言)没有任何区别。当系统完成应用程序(编辑,原始文本是:杀死进程)时,存储在 SavedStateHandle 中的 LiveData 消失了。

我没有更改任何依赖项。我在Arctic Fox 2020.3.1(底部导航模板)中使用了一个模板。它编译得很好,可以将 SavedStateHandle 添加到 AndroidViewModel 子类,但它不会保存 LiveData。

于 2021-10-20T09:27:01.183 回答
1

在您链接的文档中,您可以在以下内容中阅读User-initiated UI-state dismissal

在这些完全解雇的情况下,用户的假设是他们已经永久地离开了活动,如果他们重新打开活动,他们希望活动从干净的状态开始。这些解雇场景的底层系统行为符合用户的期望——活动实例将被销毁并从内存中删除,以及存储在其中的任何状态以及与活动相关联的任何已保存的实例状态记录。

来自https://developer.android.com/topic/libraries/architecture/saving-states#use_onsaveinstancestate_as_backup_to_handle_system-initiated_process_death

所以你误解了 SavedStateHandle 和 ViewModel 的意图和范围。如果在用户启动 UI 状态解除后恢复状态对您的应用程序非常重要,那么我建议首先关注将状态保留到磁盘(数据库、文件、SharedPreferences 等)并在适当时恢复 - 然后再考虑通过以下方式促进更流畅的 UX利用 ViewModel 中的 SavedStateHandle 等功能。

于 2021-10-13T23:19:22.597 回答