это мой модуль активности:
@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: без параметра Searcher
в конструкторе моя модель представления может быть введена нормально.