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
    }
}

0 ответов

Другие вопросы по тегам