【问题标题】:Savedstateviewmodelfactory is finall, cannot inheritSavedstateviewmodelfactory是finall,不能继承
【发布时间】:2020-07-11 14:51:00
【问题描述】:
class SettingsViewModelFactory(application: Application, owner: SavedStateRegistryOwner) : SavedStateViewModelFactory(application, owner){


    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(SettingsViewModel::class.java)){
            return SettingsViewModel() as T
        }
        throw IllegalArgumentException("Invalid ViewModel class")
    }

}

我在 SavedStateViewModelFactory 下方得到一个红色下划线,表示该类型是最终类型,无法继承。我该怎么办?文档太模糊了。 还有我要在退货中输入什么状态?

【问题讨论】:

  • 您实际上想用自己的工厂做什么?默认工厂已经支持无参数构造函数。
  • 它被标记为 final 意味着你不能扩展它并且必须按原样使用它。更多信息在这里developer.android.com/reference/androidx/lifecycle/…
  • 我只是按照我在代码实验室中学到的知识。我不应该建立自己的工厂吗?
  • 你在关注什么codelab?不,如果你不做任何事情,你就不需要自己的工厂——默认工厂的存在是有原因的。
  • 这个:codelabs.developers.google.com/codelabs/… 在按下后退按钮后,我正在尝试保存一些数据,经过一些研究,我认为 SavedStateHandle 将是我的解决方案,所以我只是尝试将其应用于工厂代码实验室我经历过的。 (更多细节:我有一个设置片段,用户可以在其中选择带有一些单选按钮的主题,我希望在用户离开片段后保存单选按钮选择)

标签: android kotlin android-jetpack android-viewmodel


【解决方案1】:

如果您想创建自己的工厂以允许使用 SavedStateHandle 构造函数参数,您可以按照 explicit note on the documentation 扩展 AbstractSavedStateViewModelFactory,而不是 SavedStateViewModelFactory

提供自定义ViewModelProvider.Factory 实例时,您可以通过扩展AbstractSavedStateViewModelFactory 来启用SavedStateHandle

但是,您不需要任何自定义工厂来支持具有零参数构造函数的 ViewModel - 默认情况下支持。如果您需要将自定义参数传递给您的 ViewModel,您只需要一个自定义工厂。对于您的代码,您可以完全删除您的自定义工厂。

【讨论】:

  • 如果您希望支持具有一些依赖项(SavedStateHandle 除外)的 AndroidViewModel,该怎么办。 AbstractSavedStateViewModelFactory 似乎不支持 AndroidViewModels。我想另一种方法是将应用程序上下文保存在您自己的视图模型中?
  • @takecare - 如果您没有为您的ViewModel 或需要将Application 传递给您的ViewModel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2017-08-10
  • 2012-06-12
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多