SavedStateHandle不持久化数据

a.t*_*aby 3 android-savedstate android-viewmodel viewmodel-savedstate

我按照下一页中的说明创建了一个 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("")
    } }
Run Code Online (Sandbox Code Playgroud)

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

val userViewModel :  UserViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)

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

val userViewModel: UserViewModel by viewModels {
            SavedStateViewModelFactory(
                application,
                this
            )
Run Code Online (Sandbox Code Playgroud)

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

sol*_*ule 6

- - 编辑: - -

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

  1. 系统杀死该进程。应用程序保留在最近使用的屏幕中。数据由 SavedStateHandle 保存(或者在 EditText 的情况下,由 savingInstanceState 中的视图保存,请参阅 Codelab)。
  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。