Dagger2 AndroidInjector Class не может быть предоставлен в конструкторе ViewModel
Я использую Dagger2 2.15 с AndroidInjector для настройки моего проекта, и я столкнулся с проблемой, когда не могу предоставить экземпляры моего класса в ViewModel. Не удается, когда я пытаюсь запустить код.
Как мне написать модуль Activity, чтобы обеспечить зависимости в конструкторе ViewModel?
Я получаю ошибку:
PermissionUtil cannot be provided without an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.rob.project.AriaApp> {
^
com.rob.project.domain.ext.PermissionUtil is injected at
com.rob.project.view.device.DeviceActivityViewModel.<init>(permissionUtil)
com.rob.project.view.device.DeviceActivityViewModel is injected at
com.rob.project.di.modules.ViewModelBinderModule.bindDeviceActivityViewModel(viewModelKey)
java.util.Map<java.lang.Class<? extends android.arch.lifecycle.ViewModel>,javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at
com.rob.project.BaseViewModelFactory.<init>(creators)
com.rob.project.BaseViewModelFactory is injected at
com.rob.project.di.modules.ViewModelFactoryModule.bindViewModelFactory$app_devBeta(factory)
android.arch.lifecycle.ViewModelProvider.Factory is injected at
com.rob.project.view.welcome.SplashActivity.viewModelFactory
com.rob.project.view.welcome.SplashActivity is injected at
dagger.android.AndroidInjector.inject(arg0)
A binding with matching key exists in component: com.rob.project.di.modules.ViewModelBinderModule_BindDeviceActivity$app_devBeta.DeviceActivitySubcomponent
Код компилируется, если я переместить @Provides
функция от DeviceModule
в AppModule
, но мне нужна активность, и я не могу понять, почему она ломается.
мой AppComponent
:
@Singleton
@Component(modules = [
/* Base modules */
AndroidSupportInjectionModule::class,
ViewModelFactoryModule::class,
ViewModelBinderModule::class,
/* Shared modules */
AppModule::class
])
interface AppComponent: AndroidInjector<MyApp> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<MyApp>()
}
В моем ViewModelBinderModule
:
@ContributesAndroidInjector(modules = [DeviceModule::class])
internal abstract fun bindDeviceActivity() : DeviceActivity
@Binds
@IntoMap
@ViewModelKey(DeviceActivityViewModel::class)
abstract fun bindDeviceActivityViewModel(viewModelKey: DeviceActivityViewModel) : ViewModel
DeviceModule
:
@Module
class DeviceModule {
@Provides
fun providePermissionUtil(activity: DeviceActivity): PermissionUtil = EasyPermissionUtil(activity)
}
DeviceActivityViewModel
:
class DeviceActivityViewModel @Inject constructor(private val permissionUtil: PermissionUtil) : BaseViewModel() {
fun hasAllPermissions(): Boolean {
return permissionUtil.hasLocationPermission()
}
}
Предоставляемый класс:
class EasyPermissionUtil @Inject constructor(val activity: Activity) : PermissionUtil {
override fun hasLocationPermission(): Boolean {
return EasyPermissions.hasPermissions(activity, Manifest.permission.ACCESS_FINE_LOCATION)
}
override fun isLocationPermanentlyDenied(): Boolean {
return false
}
override fun hasScanningPermission(): Boolean {
return false
}
override fun onLocationPermissionDenied(value: Boolean) {
// Todo
}
override fun onDestroy() {
// Todo
}
}