Dagger 2在Kotlin中出现未解决的引用问题:DaggerXXXSub。

3

我正在尝试在我的Android项目中使用Dagger 2,项目是用Kotlin编写的。我按照Dagger 2 Android示例将Dagger 2应用于我的项目。

app/build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.wj.kotlintest"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.0.1', {
    exclude group: 'com.android.support', module: 'support-annotations'
          })
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"

    implementation 'com.google.dagger:dagger-android-support:2.11'
    kapt 'com.google.dagger:dagger-compiler:2.11'
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

ApplicationSub.kt

@Singleton
@Component(modules = arrayOf(ActivityModule::class))
interface ApplicationSub {
    fun inject(app: MyApplication)
} 

ActivityModule.kt

@Module(subcomponents = arrayOf(MainActivitySub::class))
abstract class ActivityModule {
    @Binds
    @IntoMap
    @ActivityKey(MainActivity::class)
    abstract fun bindMainActivity(builder: MainActivitySub.Builder): AndroidInjector.Factory<out Activity>
}

MainActivitySub.kt

@Subcomponent
interface MainActivitySub : AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder : AndroidInjector.Builder<MainActivity>()
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

MyApplication.java

public class MyApplication extends Application implements HasActivityInjector {

    @Inject
    DispatchingAndroidInjector<Activity> activityInjector;

    @Override
    public void onCreate() {
        super.onCreate();

        DaggerApplicationSub
                .create()
                .inject(this);

    }

    @Override
    public AndroidInjector<Activity> activityInjector() {
        return activityInjector;
    }
}

我的代码像这样,它可以运行,但是当我尝试将MyApplication.java转换为MyApplication.kt时,项目无法运行。

MyApplication.kt

class MyApplication: Application(), HasActivityInjector{

    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()

        DaggerApplicationSub
                .builder()
                .build()
                .inject(this)

    }

    override fun activityInjector(): AndroidInjector<Activity> {
        return activityInjector
    }
}

我可以构建成功的项目,而且文件DaggerApplicationSub已经存在,但当我尝试运行这个项目时,出现了编译错误:

Error:(5, 49) Unresolved reference: DaggerApplicationSub
Error:(24, 9) Unresolved reference: DaggerApplicationSub

我不知道如何解决这个问题,我的所有代码都在KotlinTest中,感谢您的帮助!


重建代码并检查。 - Sharath kumar
1个回答

2

已经解决了...我之前尝试过,但是它没有起作用,gradle构建失败了。无论如何非常感谢你! - W.J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接