Объект в области действия не может быть введен во ViewModel - PullRequest
0 голосов
/ 04 августа 2020

это мой модуль активности:

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

...