我有两个继承自ViewModelProvider.Factory
的类。事情是,我有多个ViewModel,我希望能够有一个通用工厂,而不是重写一切。
我的代码是这样的:
class AViewModelFactory(): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return AViewModel() as T
}
}
class BViewModelFactory(): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return BViewModel() as T
}
}
class AViewModel: ViewModel() {
// Some code
}
class BViewModel: ViewModel() {
// Some code
}
使用时:
// Fragment A
val factory = AViewModelFactory()
viewModel = ViewModelProvider(this, factory)[AViewModel::class.java]
// Fragment B
val factory = BViewModelFactory()
viewModel = ViewModelProvider(this, factory)[BViewModel::class.java]
有没有一种方法可以让我有一个泛型类(比如GenericViewModelFactory
)我可以这样称呼它:
// Fragment A
val factory = GenericViewModelFactory(AViewModel)
viewModel = ViewModelProvider(this, factory)[AViewModel::class.java]
// Fragment B
val factory = GenericViewModelFactory(BViewModel)
viewModel = ViewModelProvider(this, factory)[BViewModel::class.java]
虽然您的视图模型不需要任何依赖,但您必须使用框架提供的公共工厂。
如果您需要自定义工厂以提供依赖项或增加实例化速度。你可以创建一个通用的工厂,它有能力创建你的任何模式。
class CommonViewModelFactory(): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return when(modelClass) {
AViewModel::class.java -> AViewModel()
BViewModel::class.java -> BViewModel()
else -> throw Throwable("Unsupported view model")
}
}
}