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

Android+Kotlin+Hilt:非Activity类无法@Inject注入问题解决

Hilt非Activity类依赖注入问题排查与解决

问题背景

最近开始学习Hilt,目前困扰多于乐趣,但喜欢挑战。核心问题是**非Activity类中注入依赖(如Context或自定义类)**遇到障碍:之前大量非Activity类用object单例实现,但无法向单例注入依赖,改为普通类后尝试字段注入,编译正常但注入字段始终为空,触发未初始化错误,同时不确定如何正确获取Context。项目为多模块结构,示例中AWFile类位于Common模块,负责文件操作,尝试注入AppSettings(配置存储类)和Context。

初始代码与错误

AWApplication(App模块)

@HiltAndroidApp
class AWApplication : MultiDexApplication() {

}

AWFile(Common模块)

class AWFile @Inject constructor() {

    @Inject
    lateinit var app: AppSettings

    @Inject
    lateinit var context: Context

    fun doSomething(){
        var color = app.actionBarEndColor
        var ctx = context
    }
    ...
}

App模块Dependencies

@Module
@InstallIn(SingletonComponent::class)
class Dependencies {

    @Provides
    @ApplicationContext
    fun provideContext(@ApplicationContext appContext: Context): Context {
        return appContext
    }
}

Common模块Dependencies

@Module
@InstallIn(SingletonComponent::class)
class Dependencies {
    @ApplicationContext
    lateinit var appContext: Context

    @Provides
    @Singleton
    fun bindsAppSettings(): AppSettings {
        return AppSettings()
    }

    @Provides
    @Singleton
    fun bindsAWFile(): AWFile {
        return AWFile()
    }
}

MainActivity(App模块)

@AndroidEntryPoint
class MainActivity : FragmentActivity() {
    @Inject
    lateinit var awFile: AWFile

    @Inject
    lateinit var app: AppSettings

    override fun onCreate(savedInstanceState: Bundle?) {
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)
        super.onCreate(savedInstanceState)

        awFile.doSomething()
    }
}

触发错误

调用awFile.doSomething()时抛出:

kotlin.UninitializedPropertyAccessException: lateinit property app has not been initialized (the same for context)

调试过程

编辑1:尝试构造注入替代字段注入

修改AWFile构造方法:

class AWFile @Inject constructor(private var app: AppSettings, private var context: Context)

Common模块Dependencies未修改,编译失败,提示bindsAWFile()方法未给AWFile传递必要参数。

编辑2:调整Dependencies方法参数

修改Common模块Dependencies:

@Module
@InstallIn(SingletonComponent::class)
class Dependencies {
    @ApplicationContext
    lateinit var appContext: Context

    @Provides
    @Singleton
    fun bindsAppSettings(): AppSettings {
        return AppSettings()
    }

    @Provides
    @Singleton
    fun bindsAWFile(appSettings: AppSettings): AWFile {
        return AWFile(appSettings, appContext)
    }
}

运行时抛出:

...Caused by: kotlin.UninitializedPropertyAccessException: lateinit property appContext has not been initialized
        at dependencies.Dependencies.getAppContext(Dependencies.kt:18)...

最终解决方案

App模块Dependencies

@Module
@InstallIn(SingletonComponent::class)
class Dependencies {

    @Provides
    @Singleton
    fun provideContext(@ApplicationContext appContext: Context): Context {
        return appContext
    }
}

Common模块Dependencies

@Module
@InstallIn(SingletonComponent::class)
class Dependencies {

    @Provides
    @Singleton
    fun bindsAppSettings(): AppSettings {
        return AppSettings()
    }

    @Provides
    @Singleton
    fun bindsAWFile(appSettings: AppSettings, context: Context): AWFile {
        return AWFile(appSettings, context)
    }
}

现在应用可正常运行,关键两点:

  • 在App模块的Dependencies中提供全局Context实例
  • 将AppSettings和Context作为bindsAWFile方法的参数,由Hilt自动注入后传递给AWFile构造器

总结

Hilt学习曲线较陡,通过调整依赖提供方式,利用构造注入结合模块参数传递,解决了非Activity类的依赖注入问题。


内容的提问来源于stack exchange,提问作者Diego Perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:39:14