如何创建自定义 viewModel 提供程序 class 以避免 viewModel 强制转换?

How to create a custom viewModel provider class where i can avoid the viewModel cast?

早上好;

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

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)

函数创建 returns AlreadyHaveAnAccountViewModel(userDataSourceRepository) 其中 AlreadyHaveAnAccountViewModel 是我的视图模型 class。 我需要创建一个自定义 viewModel 工厂 class,我可以在其中传递 AlreadyHaveAnAccountViewModel 参数,或者一种避免最后令人讨厌的转换的方法。

帮助

我找到了答案: 使用这种方法,您最终可以避免强制转换。这样,您的所有项目中就只有一个 ViewModelProvider。

这将适用于任何接受 UserDataSourceRepository 作为构造函数参数的 class,如果 class 没有正确的构造函数,将抛出 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
  }
}