0
votes

I've been working on instant app for a few days. I didn't get it compiled yet due to Dagger issue.

The project is split into base, export, preview as features.

In export module

@ExportScope
@Component(
        modules = [DrawExportModule::class],
        dependencies = [AppComponent::class])
interface DrawExportComponent: AndroidInjector<LiveDrawingExportActivity> {

    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<LiveDrawingExportActivity>(){
        abstract fun plus(component: AppComponent): Builder
    }
}

AppComponent.kt

@Singleton
@Component(modules = [
    AndroidInjectionModule::class,
    AppModule::class,
    ActivityBindingModule::class,
    ServiceBindingModule::class])
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(context: Context): Builder

        fun build(): AppComponent
    }

    fun inject(app: LiveMessageApplication)
}

AppModule.kt

   @Module(includes = [(DataModule::class)])
   class AppModule {
   @Singleton
   @Provides
   fun provideStateManager(): StateManager {
        return StateManager.getInstance()
   }
}

Compile error log

    /Users/*/features/export/build/tmp/kapt3/stubs/debug/*/ui/draw/di/DrawExportComponent.java:8: 
error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] *.ui.StateManager cannot be provided without an @Inject constructor or an @Provides-annotated method.
    public abstract interface DrawExportComponent extends dagger.android.AndroidInjector<com.ctech.livemessage.ui.draw.LiveDrawingExportActivity> {
                    ^
          *.ui.StateManager is injected at
              *.LiveDrawingExportActivity.stateManager
          *.LiveDrawingExportActivity is injected at
              dagger.android.AndroidInjector.inject(T)

It seems to me dependency component doesn't work in this case. I have no clue to go forward.

More information base/build.gradle

apply plugin: 'com.android.feature'
apply plugin: 'io.fabric'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'

android {

    compileSdkVersion deps.build.compileSdkVersion

    baseFeature = true

    defaultConfig {
        minSdkVersion deps.build.minSdkVersion
        targetSdkVersion deps.build.targetSdkVersion

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {

        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug
        }
    }

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }

}

dependencies {

    application project(":installed")
    feature project(":features:export")
    feature project(":features:preview")
}

export/build.gradle

apply plugin: 'com.android.feature'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'

android {

    compileSdkVersion deps.build.compileSdkVersion

    defaultConfig {
        minSdkVersion deps.build.minSdkVersion
        targetSdkVersion deps.build.targetSdkVersion
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {

        release {
            debuggable true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), '../../proguard.pro'
            signingConfig signingConfigs.debug
        }

    }

    sourceSets {
        main {
            jniLibs.srcDirs 'libs'
        }
    }

    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }

}

dependencies {

    implementation project(':features:base')

    kapt deps.dagger.compiler
    kapt deps.dagger.androidCompiler

}
1

1 Answers

3
votes

The issue is that DrawExportComponent doesn't see StateManager, because the latter is part of AppComponent.

Unlike subcomponents, with component dependencies, dependent components don't get access to all of parent component. You have to explicitly specify what's shared, by adding:

fun stateManager(): StateManager

to your AppComponent.

More info in official documentation