错误:error.NonExistentClass Kotlin在多模块Dagger项目中

Seb*_*wan 24 android multi-module kotlin dagger-2

我正在使用Dagger 2和Kotlin进行Android开发.我的项目也是一个多模块项目.我的settings.gradle文件是这样的:

include :app
include :lib
Run Code Online (Sandbox Code Playgroud)

我也在维护lib模块.

在Dagger文件中(例如在组件中),我尝试从其他模块中获取项目.例如:

@Component
interface AppComponent{
    fun getPresenter() : Presenter
}
Run Code Online (Sandbox Code Playgroud)

Presenter对象在lib模块中定义.我在linux环境中工作,我正在使用Android Studio 3预览金丝雀5.代码运行良好,我能够生成APK.

但是我的公司希望使用稳定版的Android Studio生成APK.我正在使用Android Studio 2.3.3.

在编译Android项目时,我遇到了这个错误:

error: error.NonExistentClass
Run Code Online (Sandbox Code Playgroud)

出现错误

:app:kaptDebugKotlin 
Run Code Online (Sandbox Code Playgroud)

执行并由dagger类找不到,该类在其他项目中定义.可能的解决方法是什么?对不起,我的英语不好.

sey*_*gin 39

只需将其添加到构建 gradle 文件即可避免相关问题 NonExistentClass

kapt {
    correctErrorTypes true 
} 
Run Code Online (Sandbox Code Playgroud)

https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction

  • 这帮助我找到了真正的问题。在添加此之前,该错误具有误导性 (2认同)
  • 这应该是公认的答案,因为它会带您了解真正的问题。 (2认同)

Ima*_*ari 22

根本原因

基本上,在使用时kapt没有太多可以解决这个问题.引用此链接来解决使用预处理器(OrmaDatabase)的另一个库中的相同问题:

因为Kotlin在Java Annotation Processing运行之前创建它的存根,所以Kotlin对OrmaDatabase一无所知,并且存根中声明的名称将是error.NonExistentClass.这打破了注释处理工具.这是一种kapt限制

如何解决(解决方法)

只需使用plain aptannotationProcessor运行Dagger编译器.我一改变了:

kapt libs.daggerCompiler
Run Code Online (Sandbox Code Playgroud)

annotationProcessor libs.daggerCompiler
Run Code Online (Sandbox Code Playgroud)

在我的模块级build.gradle文件中,我能够得到错误.在修复错误之后,你必须将该行还原为kapt,否则将无法生成匕首类,因为它们是在Kotlin中定义的.

  • 您也可以运行../gradlew:app:compileDebugJavaWithJavac --stacktrace`找出错误的来源。 (2认同)

And*_*czl 6

tldr:在build.gradle中将kapt更改为annotationProcessor,您将看到真正的问题。

我遇到了同样的错误,结果发现我只是注释掉了我在 AppComponent 中使用的一个类。不幸的是 kapt 工具没有给我正确的错误消息。如果您在库的编译器中将 kapt 更改为annotationProcessor,并尝试构建,它也不会成功,但您会收到更详细的错误消息。


GoR*_*RoS 5

我在NonExistentClass使用Dagger的多模块项目中遇到了非常相似的错误,结果却忘记了添加kotlin库依赖项。因此,只需将其添加到子模块中即可解决我的问题:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
Run Code Online (Sandbox Code Playgroud)


Coo*_*ind 5

删除过时的库后

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

incompatible types: NonExistentClass cannot be converted to Annotation 
Run Code Online (Sandbox Code Playgroud)

看着https://dagger.dev/hilt/view-model.html我改变了ViewModel

class MainViewModel @ViewModelInject constructor(
    ...
) : ViewModel() {
Run Code Online (Sandbox Code Playgroud)

@HiltViewModel
class MainViewModel @Inject constructor(
    ...
) : ViewModel() {
Run Code Online (Sandbox Code Playgroud)