You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:45:16