【发布时间】:2018-07-27 16:57:09
【问题描述】:
我最近开始使用 Android 开发,并且来自 iOS 背景,依赖注入框架和 ViewModelFactories 等概念对我来说是一个新事物。在我看到的所有教程中,ViewModels 总是扩展 android.arch.lifecycle.ViewModel 提供的 ViewModel 类。如果 viewModel 有参数,那么 Dagger 必须创建一个 ViewModelFactory 并将其注入到一个活动中
@Provides
@ActivityScope
fun provideViewModelFactory(dependency: Dependency) : ViewModelProvider.Factory = CustomViewModelFactory(dependency)
CustomViewModelFactory 将负责创建 ViewModel。这一切都很好,但是,当我可以将 viewModel 直接注入到类似这样的活动中时,我并没有真正理解 viewModelFactory 的观点:
@Module
class ViewModelModule(private val user: User) {
@ActivityScope
@Provides
fun provideMainViewModel() = MainViewModel(user = user)
fun provideOtherViewModel() = OtherViewModel()
}
@ActivityScope
@Subcomponent(modules = [ViewModelModule::class])
interface MainActivitySubComponent {
fun inject(activity: MainActivity)
}
@ApplicationScope
@Component()
interface ApplicationComponent {
fun addMainActivitySubComponent(viewModelModule: ViewModelModule) : MainActivitySubComponent
}
在我的活动中
class MainActivity : AppCompatActivity() {
@Inject lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val subComponent = (application as MainApplication).component.addMainActivitySubComponent(ViewModelModule(User("NEW NAME")))
subComponent.inject(this)
}
}
那么,当我可以立即将 viewModel 注入到我的活动中时,ViewModelFactory 的意义何在?
【问题讨论】:
标签: java android kotlin dagger-2