无法从Java代码向Kotlin依赖组件注入对象的问题解决
问题背景
使用Dagger 2版本2.51.1,依赖配置如下:
implementation 'com.google.dagger:dagger:2.51.1' annotationProcessor 'com.google.dagger:dagger-compiler:2.51.1' kapt "com.google.dagger:dagger-compiler:2.51.1"
依赖注入的组件和模块采用Kotlin编写,但Java实现的MainActivity无法完成对象注入。
相关代码
Java实现的MainActivity
public class MainActivity extends BaseActivity { @Inject permissionHelper permissionHelper; @Inject MbAppFeature mpAppFeature; @Inject SharedPref sharedPref; @Inject ViewMvcFactory viewMvcFactory; @SuppressLint({"ResourceType", "SuspiciousIndentation"}) @Override protected void onCreate(Bundle savedInstanceState) { getInjector().inject(this); super.onCreate(savedInstanceState); scanModeNumber = sharedPref.read("scanModeNumber",0); isFirstRun = sharedPref.read("isFirstRun", true); } }
Kotlin实现的BaseActivity
open class BaseActivity: AppCompatActivity() { private val appCompositionRoot get() = (application as CustomApplication).appComponent val activityComponent by lazy { DaggerActivityComponent.builder() .activityModule(ActivityModule(this, appCompositionRoot)) .build() } private val controllerComponent by lazy { DaggerControllerComponent.builder() .controllerModule(ControllerModule(activityComponent)) .build() } public val injector get() = controllerComponent }
Kotlin实现的组件与模块
@Component(modules = [ControllerModule::class]) interface ControllerComponent { fun inject(activity: MainActivity) } @Module class ControllerModule(private val activityComponent: ActivityComponent) { @Provides fun activity() = activityComponent.activity() @Provides fun layoutInflater() = activityComponent.layoutInflater() @Provides fun sharedPref() = activityComponent.sharedPref() }
报错信息
运行时触发空指针异常:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Integer SharedPref.read(java.lang.String, int)' on a null object reference at (MainActivity.java:147)
同时发现Dagger自动生成的ControllerComponent中,inject方法为空实现:
@Override public void inject(MainActivity activity) { }
环境信息
- Gradle版本:8.4
- Gradle插件版本:8.3.1
- Java版本:17
解决方案
- 升级相关工具至指定版本:
activity_version = "1.9.0" kotlin_version ='1.9.23' agp_version = '8.4' dagger_version = '2.51.1' gradle-8.6-bin.zip
- 将MainActivity类与依赖模块调整为同一包结构。
内容的提问来源于stack exchange,提问作者Nadin Martini
相关产品推荐
相关产品推荐

