Dagger2:ViewModel中的字段注入具有编译时间和运行时依赖性

时间:2018-12-24 04:27:02

标签: android dagger-2 android-viewmodel

我有一个学生列表,显示在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))
    }
}

编辑:看来活动上下文没有被注入,而是应用程序上下文被注入。

0 个答案:

没有答案