如何在Android Studio中的Java库模块中使用Dagger?

4

我正在一个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生成的类,其次,如何从生成的类中删除上述错误?
1个回答

5
在你的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
)

然后创建你的Dagger模块:

@Module
class ModuleUtil {

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

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

}

然后创建您的 飞镖组件(dagger component):

@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()

1
你可能还需要使用 implementation 'com.google.dagger:hilt-core:$VERSION' - Paschalis

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