这是我的活动模块:
@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
参数,我的视图模型可以正常注入。