【问题标题】:SavedState module Android Kotlin with View Model - value does not seem to saveSavedState module Android Kotlin with View Model - 值似乎没有保存
【发布时间】:2020-01-17 04:05:48
【问题描述】:

我已按照 Google Codelab 中有关保存状态模块的说明进行操作。

我的 gradle 依赖是:

implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc03"

我的视图模型工厂是:

class MyViewModelFactory(val repository: AppRepository, owner: SavedStateRegistryOwner,
                              defaultArgs: Bundle? = null) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {

    override fun <T : ViewModel?> create(
            key: String,
            modelClass: Class<T>,
            handle: SavedStateHandle): T {
        return MyViewModel(repository, handle) as T
    }
}

我的视图模型:

 class MyViewModel constructor(val repository: AppRepository, private val savedStateHandle: SavedStateHandle): ViewModel() {
       fun getMyParameter(): LiveData<Int?> {
            return savedStateHandle.getLiveData(MY_FIELD)
        }

        fun setMyParameter(val: Int) {
            savedStateHandle.set(MY_FIELD, val)
        }
    }

我的片段:

      class MyFragment : androidx.fragment.app.Fragment() {
           override fun onCreate(savedInstanceState: Bundle?) {        
                arguments?.let {
                   var myField = it.getInt(MY_FIELD)
 activitiesViewModel.setMySavedValue(myField ?: 0)
                }

        }
        }

在使用应用时,已保存状态字段的实时数据会正确更新。但是,一旦我将应用程序置于后台(并且我在开发人员选项中设置了“不保留活动”),然后重新打开应用程序,实时数据就会显示一个值,就好像它从未设置过一样。换句话说,保存的状态句柄似乎忘记了我要保存的字段。

有什么想法吗?

【问题讨论】:

  • 我认为对于您的场景“不要在开发人员选项中保留活动”,您应该使用 onSaveInstanceStateonRestoreInstanceState ,视图模型可以在您有配置更改时保存状态。查看这篇文章:medium.com/better-programming/…
  • 在文章中,我说过在activity kill的情况下,“使用保存状态/恢复状态,或者你可以使用今年推出的StateSaveHandle。”。我在视图模型中使用状态保存句柄,所以它应该可以工作吗?
  • 还有一点出乎意料的是,当app重新打开时,MY_FIELD键仍然存在于状态保存的句柄中,但是值不对。

标签: kotlin viewmodel viewmodel-savedstate


【解决方案1】:

我遇到了同样的问题。通过我停止在 onRestoreInstanceState 方法中从 SavedStateHandle 请求保存的值这一事实解决了这个问题。此调用在 onCreate 方法中正确使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多