【发布时间】:2020-02-09 22:28:50
【问题描述】:
所以我正在使用 Dagger 处理一些示例 MVVM 项目。我有一个像这样的视图模型工厂:
class DaggerViewModelFactory @Inject constructor(private val viewModelsMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = viewModelsMap[modelClass] ?:
viewModelsMap.asIterable().firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
return try {
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
视图模型工厂模块
@Module
abstract class ViewModelFactoryModule {
@Binds
abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory
}
我有一个 ViewModelModule:
@Module
abstract class MyViewModelModule {
@Binds
@IntoMap
@ViewModelKey(TakePicturesViewModel::class)
abstract fun bindTakePictureViewModel(takePicturesViewModel: TakePicturesViewModel): ViewModel
}
这样的组件:
@PerActivity
@Subcomponent(modules = [ActivityModule::class, ViewModelFactoryModule::class, MyViewModelModule::class])
interface ActivityComponent {
fun inject(mainActivity: MainActivity)
}
一个像这样的视图模型:
class TakePicturesViewModel @Inject constructor(app: Application): AndroidViewModel(app) {...
所以我可以使用这样的视图模型工厂将我的视图模型注入到我的活动中:
@Inject
lateinit var viewModelFactory: DaggerViewModelFactory
private lateinit var takePicturesViewModel: TakePicturesViewModel
.
.
.
takePicturesViewModel = ViewModelProviders.of(this, viewModelFactory).get(TakePicturesViewModel::class.java)
或者根本没有视图模型工厂,像这样:
@Inject
lateinit var takePicturesViewModel: TakePicturesViewModel
两种方式都有效,所以我想知道哪一种是正确的工作方式,如果使用 Dagger 允许我在不需要 viewmodelfactory 的情况下注入视图模型,是否有充分的理由保留它?或者我应该摆脱这个viewmodelfactory的?
提前感谢您的任何建议。
问候
【问题讨论】:
-
您需要
ViewModelProvider(this, factory).get(vmClass),但不一定需要多重绑定。见github.com/Zhuinden/DaggerViewModelExperiment/blob/…
标签: mvvm dagger-2 dagger android-viewmodel android-mvvm