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
Ima*_*ari 22
基本上,在使用时kapt没有太多可以解决这个问题.引用此链接来解决使用预处理器(OrmaDatabase)的另一个库中的相同问题:
因为Kotlin在Java Annotation Processing运行之前创建它的存根,所以Kotlin对OrmaDatabase一无所知,并且存根中声明的名称将是error.NonExistentClass.这打破了注释处理工具.这是一种kapt限制
只需使用plain apt或annotationProcessor运行Dagger编译器.我一改变了:
kapt libs.daggerCompiler
Run Code Online (Sandbox Code Playgroud)
至
annotationProcessor libs.daggerCompiler
Run Code Online (Sandbox Code Playgroud)
在我的模块级build.gradle文件中,我能够得到错误.在修复错误之后,你必须将该行还原为kapt,否则将无法生成匕首类,因为它们是在Kotlin中定义的.
tldr:在build.gradle中将kapt更改为annotationProcessor,您将看到真正的问题。
我遇到了同样的错误,结果发现我只是注释掉了我在 AppComponent 中使用的一个类。不幸的是 kapt 工具没有给我正确的错误消息。如果您在库的编译器中将 kapt 更改为annotationProcessor,并尝试构建,它也不会成功,但您会收到更详细的错误消息。
我在NonExistentClass使用Dagger的多模块项目中遇到了非常相似的错误,结果却忘记了添加kotlin库依赖项。因此,只需将其添加到子模块中即可解决我的问题:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
Run Code Online (Sandbox Code Playgroud)
删除过时的库后
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)