活动范围内的对象无法注入到ViewModel中

时间:2020-08-04 03:17:27

标签: android mvvm dependency-injection dagger-2 dagger

这是我的活动模块:

@ActivityScope
@ContributesAndroidInjector(modules = [MainModule::class])
abstract fun bindMainActivity(): MainActivity

这是我的ViewModel模块:

@Singleton
class ViewModelFactory @Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) :
    ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T =
        viewModels[modelClass]?.get() as T
}

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER
)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>)


@Module
abstract class ViewModelModule {

    @Binds
    internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    internal abstract fun bindMainViewModel(viewModel: MainViewModel): ViewModel
}

这是我的MainModule:

@Module
class MainModule {

    @Provides
    fun provideSearcher(context: Context): Searcher {
        LogUtils.e("Provide Searcher")
        val searchFolder = File(context.filesDir, FOLDER_SEARCH_PARENT)
        return Searcher(searchFolder.absolutePath)
    }
}
// My MainViewModel's constructor:
class MainViewModel @Inject constructor(val preferencesOnGlobalScope: MyPreferences, val searcher: Searcher)

这就是我在MainViewModel中获得MainActivity的方式:

@Inject
lateinit var viewModelFactory: ViewModelFactory
// get view model on onCreate
viewModel = ViewModelProvider(this, viewModelFactory)[MainViewModel::class.java]

但是,我总是会收到此错误:error: [Dagger/MissingBinding] io.abcxyz.Searcher cannot be provided without an @Inject constructor or an @Provides-annotated method.嗯,那是什么?我在MainModule上提供了它。你们能给我提些建议吗?

P / s:在Constructor上没有Searcher参数,我的视图模型可以正常注入。

0 个答案:

没有答案