Android Hilt 高级用法

news/2025/3/3 22:09:38/

在这里插入图片描述

Hilt 是 Android 官方推荐的依赖注入框架,虽然它提供了简单易用的 API,但在复杂项目中,我们可能需要用到更高级的特性,比如自定义作用域、多模块 DI、绑定接口、多构造函数注入等。

本文将介绍 Hilt 的一些高级用法,并结合实际场景进行讲解。

1. 自定义作用域(Custom Scope)

Hilt 默认提供了一些作用域,如 @SingletonComponent@ActivityRetainedComponent@ViewModelComponent 等。但是,在某些情况下,我们可能需要自定义作用域。

(1)创建自定义作用域

 @Scope@Retention(AnnotationRetention.RUNTIME)annotation class CustomScope

(2)创建带有自定义作用域的组件

 @Module@InstallIn(SingletonComponent::class)object CustomModule {@CustomScope@Providesfun provideCustomService(): CustomService {return CustomService()}}

(3)在类中使用依赖注入

 class CustomRepository @Inject constructor(private val customService: CustomService) {fun fetchData() = customService.getData()}

2. Hilt 多模块依赖注入

在大型项目中,通常会拆分多个模块。Hilt 允许我们在不同的模块中管理依赖关系。

(1)在 Library Module 添加 Hilt 支持

 plugins {id("com.google.dagger.hilt.android")}

(2)在 Library Module 中定义 Hilt Module

 @Module@InstallIn(SingletonComponent::class)object LibraryModule {@Providesfun provideLibraryDependency(): LibraryDependency {return LibraryDependency()}}

(3)在 App Module 中使用 Library Module 的依赖

 class AppRepository @Inject constructor(private val libraryDependency: LibraryDependency) {fun doSomething() = libraryDependency.performAction()}

3. 绑定接口(@Binds)

在实际开发中,我们通常会使用接口进行面向接口编程,而不是直接注入实现类。Hilt 允许我们使用 @Binds 绑定接口到具体实现。

(1)定义接口和实现类

 interface AnalyticsService {fun trackEvent(event: String)}class FirebaseAnalyticsService @Inject constructor(): AnalyticsService {override fun trackEvent(event: String) {println("Tracking event: $event")}}

(2)使用 @Binds 进行绑定

 @Module@InstallIn(SingletonComponent::class)abstract class AnalyticsModule {@Bindsabstract fun bindAnalyticsService(firebaseAnalyticsService: FirebaseAnalyticsService): AnalyticsService}

(3)在 ViewModel 中使用绑定的接口

 @HiltViewModelclass AnalyticsViewModel @Inject constructor(private val analyticsService: AnalyticsService) : ViewModel() {fun logEvent() {analyticsService.trackEvent("User Logged In")}}

4. 多构造函数注入

在某些情况下,一个类可能有多个构造函数,我们可以使用 @AssistedInject 进行灵活的依赖注入。

(1)添加 Assisted Injection 依赖

 dependencies {implementation("com.squareup.inject:assisted-inject-annotations-dagger2:0.6.0")kapt("com.squareup.inject:assisted-inject-processor-dagger2:0.6.0")}

(2)创建使用 AssistedInject 的类

 @AssistedInjectclass MyAssistedClass @AssistedInject constructor(@Assisted private val param: String,private val someDependency: SomeDependency) {fun doWork() = "Processing $param with ${someDependency.getData()}"}

(3)创建工厂类

 @AssistedFactoryinterface MyAssistedFactory {fun create(param: String): MyAssistedClass}

(4)在 ViewModel 中使用 Assisted Injection

 @HiltViewModelclass MyViewModel @Inject constructor(private val myAssistedFactory: MyAssistedFactory) : ViewModel() {fun getProcessedData(param: String): String {return myAssistedFactory.create(param).doWork()}}

5. 结论

本文介绍了 Hilt 的一些高级用法,包括自定义作用域、多模块依赖注入、接口绑定和多构造函数注入。这些技术可以帮助我们更好地管理依赖,构建灵活、可维护的 Android 应用。希望你可以将这些高级用法应用到你的项目中,提高开发效率!


http://www.ppmy.cn/news/1576391.html

相关文章

DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨

文章目录 一、DeepSeek:知识图谱与高效信息检索1. 核心技术2. 主要特点3. 应用场景4. 实际案例 二、Grok:通用人工智能框架1. 核心技术2. 主要特点3. 应用场景4. 实际案例 三、ChatGPT:聊天机器人与通用对话系统1. 核心技术2. 主要特点3. 应用…

【MySQL】 基本查询(上)

欢迎拜访:-CSDN博客 本篇主题:【MySQL】 基本查询(上) 发布时间:2025.2.14 隶属专栏:MySQL CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 目录 Create 基本知识…

大白话前端性能优化方法的分类与具体实现

大白话前端性能优化方法的分类与具体实现 一、资源加载优化 1. 压缩与合并文件 大白话解释: 咱们的网页代码里,就像一个房间堆满了东西,有很多没用的“杂物”,比如代码里的空格、注释啥的。压缩文件就是把这些“杂物”清理掉&a…

Linux安装jdk,node,mysql,redis

准备工作: 1.安装VMware软件,下载CentOs7镜像文件,在VMware安装CentOs7 2.宿主机安装Xshell用来操作linux 3. .宿主机安装Xftp用来在宿主机和虚拟机的linux传输文件 案例1:在 /home/soft文件夹解压缩jdk17,并配置环…

Linux运维——软件管理

Linux软件管理 一、rpm1.1、默认配置1.1.1、安装文件的默认位置1.1.2、配置文件位置1.1.3、查询已安装软件包的文件位置1.1.4、自定义安装路径1.1.5、rpm包缓存位置1.1.6、总结 1.2、使用方式1.2.1、基本用法1.2.2、常用示例1.2.3、高级用法1.2.4、注意事项1.2.5、与其它工具的…

git和gitee在idea中的使用

1.下载git 2.注册一个gitee且创建一个项目 3.在idea的plunge中下在gitee 4.登录gitee 别人使用的话复制 粘贴 commit提交到本地仓库 push推送到云端仓库

自动驾驶FSD技术的核心算法与软件实现

引言:FSD技术的定义与发展背景 在当今快速发展的科技领域中,自动驾驶技术已经成为全球关注的焦点之一。其中,“FSD”(Full Self-Driving,全自动驾驶)代表了这一领域的最高目标——让车辆在无需人类干预的情…

2.4 自动化评测答疑机器人的表现-大模型ACP模拟题-真题

真题 真题1:哪些是生成阶段的评估指标?哪些是召回阶段的评估指标? 整体回答质量的评估: Answer Correctness,用于评估 RAG 应用生成答案的准确度。 生成环节的评估: Answer Relevancy,用于评…