我有一个学生列表,显示在RecyclerView
中,对于每个学生,我都有StudentViewModel
。由于StudentViewModel
需要从数据库运行时检索的Student
对象,因此我不确定如何为StudentViewModel
设置构造函数注入,因此在这里没有尝试DI。但是,现在我需要在视图模型中使用另一个依赖项,该依赖项可以在编译时解决,并且是我的NavUtil
类。
我设法通过以下几行将其注入到StudentViewModel
中:
DaggerAppComponent.builder()
.application(MyApp.INSTANCE)
.build()
.inject(this)
但是我不认为这是正确的方法,因为我只是为了DI而从ViewModel引用Application类。我读过ViewModelFactory
可能是可行的,但是我找不到任何可靠的示例或对此的引用。我已经将它用于具有编译时依赖性的ViewModels,但无法找出具有编译时间和朗姆时间依赖性的 ViewModel
(s)的方式。如果有人能指出我正确的方向,那就太好了。
顺便说一句,这是我对DI的整体实现:
应用组件
@Component(modules = [AndroidInjectionModule::class, AndroidSupportInjectionModule::class,
AppModule::class, AppProvider::class,StudentProvider::class])
@Singleton
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(app: MyApp)
fun inject(studentViewModel: StudentViewModel)
StudentProvider
@Module
abstract class StudentProvider {
@ContributesAndroidInjector(modules = [(ViewModelModule::class)])
abstract fun bindHomeActivity(): HomeActivity
}
ViewModelModules
@Module
class ViewModelModule {
@ActivityContext
@Provides
fun provideNavUtils(activity: Activity): NavUtil = NavUtil(activity)
}
StudentViewModel
class StudentViewModel(student: Student) : BaseViewModel() {
@Inject
lateinit var navUtils: NavUtil
init {
DaggerAppComponent.builder()
.application(MyApp.INSTANCE)
.build()
.inject(this)
}
fun onSettingsTapped() {
navUtils.navigateToSettings()
}
}
NavUtil
class NavUtil @Inject constructor(@ActivityContext private val context: Context) {
fun navigateToSettings() {
context.startActivity(Intent(context, SettingsActivity::class.java))
}
}
编辑:看来活动上下文没有被注入,而是应用程序上下文被注入。