【问题标题】:How to create a custom viewModel provider class where i can avoid the viewModel cast?如何创建一个自定义 viewModel 提供程序类,我可以避免 viewModel 演员?
【发布时间】:2019-11-01 13:22:45
【问题描述】:

早安;

我有这个自定义 ViewModel 工厂类:

class AlreadyHaveAnAccountFragmentViewModelFactory (private val userDataSourceRepository: UserDataSourceRepository) :
ViewModelProvider.NewInstanceFactory() {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return AlreadyHaveAnAccountViewModel(userDataSourceRepository) as T
  }
}

    /**
     * Initializing our ViewModel using a custom Factory design pattern
     */
    alreadyHaveAnAccountViewModel = ViewModelProviders.of(
        this,
        AlreadyHaveAnAccountFragmentViewModelFactory(
            RepositoryFactory.createApiRepository()
        )
    ).get(AlreadyHaveAnAccountViewModel::class.java)

函数 create 返回 AlreadyHaveAnAccountViewModel(userDataSourceRepository) 其中 AlreadyHaveAnAccountViewModel 是我的 viewModel 类。 我需要创建一个自定义 viewModel 工厂类,我可以在其中传递 AlreadyHaveAnAccountViewModel 参数,或者最终避免讨厌的演员表的方法。

帮助

【问题讨论】:

  • 我不太确定你想做什么,自定义 ViewModelFactory 参数你的 ViewModel (AlreadyHaveAnAccountViewModel)?为什么需要这个?
  • 使用这个方法我需要在每次创建新的 ViewModel 时创建一个新的 ViewModelProvider,我想创建一个自定义的 viewModel,我可以在我的项目中将它与任何 viewModel 一起使用
  • 我想避免最后的讨厌演员:

标签: kotlin mvvm viewmodel viewmodelproviders


【解决方案1】:

我找到了答案: 使用这种方法,您最终可以避免演员阵容。这样,您的所有项目中只有一个 ViewModelProvider。

这适用于任何接受 UserDataSourceRepository 作为构造函数参数的类,如果该类没有正确的构造函数,则会抛出 NoSuchMethodException。

class AlreadyHaveAnAccountFragmentViewModelFactory (private val userDataSourceRepository: UserDataSourceRepository) :
ViewModelProvider.NewInstanceFactory() {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return modelClass.getConstructor(UserDataSourceRepository::class.java).newInstance(userDataSourceRepository) as T
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-02-15
    相关资源
    最近更新 更多