首页 > 解决方案 > 如何在 Android Studio 的 Java 库模块中使用 Dagger?

问题描述

我在 Android Studio 项目的 Java 库模块中使用 Dagger,这是我build.gradle的模块的样子:

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.google.dagger:dagger:2.24'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
}

sourceCompatibility = "7"
targetCompatibility = "7"

我可以看到 Dagger 正在正确生成实现并且它们存在build/generated/sources/annotationProcessor但由于某种原因我无法在代码中访问它们。package此外,生成的文件在声明中显示错误:

包名“com.example.javamodule”与文件路径“java.main.com.example.javamodule”不对应

我在这里有两个问题。首先,如何在我的 java 模块代码中访问 Dagger 生成的类,其次,如何从生成的类中删除上述错误?

标签: javaandroiddependency-injectiondagger-2generated-code

解决方案


在您的 java 库的 gradle 文件中:

plugins {
    id 'java-library'
    id 'kotlin'
    id 'kotlin-kapt'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    //Dependency injection
    implementation 'com.google.dagger:dagger:2.27'
    kapt 'com.google.dagger:dagger-compiler:2.24'
}

然后创建一个类及其依赖项:

class First
@Inject
constructor(
    private val second: Second,
    private val third: Third
) {
    fun firstFunction() {
        print(second.secondMessage())
        print(third.name)
    }
}

class Second(
    private val name: String
) {
    fun secondMessage(): String {
        return name
    }
}

class Third(
    val name: String
)

然后创建你的匕首模块:

@Module
class ModuleUtil {

    @Provides
    fun providesSecond(): Second {
        return Second("second")
    }

    @Provides
    fun providesThird(): Third {
        return Third("third")
    }

}

然后创建你的匕首组件:

@Singleton
@Component(modules = [
    ModuleUtil::class
])
interface MainComponent {

    fun maker(): First

}

处理生成的组件的对象:

object DaggerWrapper {

    lateinit var mainComponent: MainComponent

    fun initComponent() {
        mainComponent = DaggerMainComponent
            .builder()
            .build()
    }

}

最后在您的应用程序 android 模块中(例如,在 Activity 中):

DaggerWrapper.initComponent()
            val mainComponent = DaggerWrapper.mainComponent
            val first = mainComponent.maker()
            first.firstFunction()

推荐阅读