Dagger2+Kotlin报错:lateinit属性loginPresenter未初始化
问题根因
lateinit property loginPresenter has not been initialized 崩溃和Dagger无关,你当前代码未编写任何Dagger注入逻辑,使用的是Moxy框架自带的@InjectPresenter完成Presenter注入,注入失败的核心原因是Kotlin项目注解处理器配置错误,Moxy框架无法生成Presenter注入的相关代码,字段始终未被赋值,点击按钮调用时直接触发异常。
修复步骤
1. 补充kapt插件,替换注解处理器配置
Kotlin项目中annotationProcessor只能处理Java代码的注解,无法识别Kotlin类中添加的@InjectPresenter、@InjectViewState注解,必须使用Kotlin官方的kapt注解处理器才能正常触发Moxy的代码生成。
- 打开模块级
build.gradle,在plugins块中添加kapt插件:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' // 新增这行 }
- 把dependencies块中所有注解处理器的依赖配置从
annotationProcessor替换为kapt,修改后相关依赖如下:
// MVP implementation 'com.arello-mobile:moxy:1.5.5' implementation 'com.arello-mobile:moxy-android:1.5.5' kapt 'com.arello-mobile:moxy-compiler:1.5.5' // 替换annotationProcessor为kapt // Dagger implementation 'com.google.dagger:dagger-android:2.42' implementation 'com.google.dagger:dagger-android-support:2.42' kapt 'com.google.dagger:dagger-android-processor:2.42' // 替换annotationProcessor为kapt kapt 'com.google.dagger:dagger-compiler:2.42' // 补上缺失的Dagger核心注解处理器,后续写Dagger逻辑时会用到
2. 清理冗余代码
删除LoginActivity.kt中未使用的冗余导包:
import com.arellomobile.mvp.presenter.PresenterType // 删掉这行,代码中完全没用到
3. 重新编译项目
配置修改完成后,依次执行以下操作避免缓存影响:
- 点击Android Studio菜单栏
File -> Invalidate Caches...,确认清除缓存并重启IDE - 重启后执行
Build -> Clean Project,等待清理完成后执行Build -> Rebuild Project - 卸载设备上之前安装的旧版本APK,重新运行安装即可
额外说明
Moxy默认的@InjectPresenter会通过Presenter的无参构造自动创建实例,如果你后续确实需要用Dagger管理Presenter实例、完成依赖注入,需要额外编写Dagger的Component、Module逻辑,配合@Inject注解使用,当前代码不需要额外改动即可正常运行。
内容的提问来源于stack exchange,提问作者Иван Рогожкин
相关产品推荐
相关产品推荐

