首页 > 其他分享 >带你了解Android Jetpack库中的依赖注入框架:Hilt

带你了解Android Jetpack库中的依赖注入框架:Hilt

时间:2024-09-11 17:54:53浏览次数:12  
标签:依赖 Jetpack Hilt 库中 组件 注解 Android class

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Hilt概述

Hilt是Google推出的一种用于Android的依赖注入(Dependency Injection,DI)框架,构建于Dagger之上,旨在简化Android应用中的依赖注入过程。通过Hilt,你可以更轻松地管理和提供依赖,显著减少DI的样板代码,并提高应用的可测试性和可维护性。

Hilt的主要概念

1、 Modules:用来定义如何提供实例。在Hilt中,使用@Module@InstallIn注解类,并使用@Provides方法提供依赖。

2、 Components:Hilt自动生成不同的组件来管理不同的生命周期。这包括单例组件、Activity组件、Fragment组件等。

3、 Inject:用来注入实例。类中的构造函数、字段和方法都可以使用@Inject注解。

4、 Entry Points:用于获取Hilt提供的实例。

Hilt的基本用法

1. 添加依赖

首先,在你的build.gradle文件中添加Hilt的依赖:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'            // Kotlin Annotation Processor
    id 'dagger.hilt.android.plugin'
}

dependencies {
    implementation "com.google.dagger:hilt-android:2.44"
    kapt "com.google.dagger:hilt-android-compiler:2.44"
}

确保在根build.gradle文件中也应用了Hilt的插件:

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44'
    }
}

2. 初始化Hilt

在Application类上添加@HiltAndroidApp注解以启用Hilt:

@HiltAndroidApp
class MyApplication : Application() {
    // Application class code
}

3. 创建Module

模块用于提供实例。在Hilt中,你可以创建一个带有@Module@InstallIn注解的类,并用@Provides方法提供依赖:

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Provides
    @Singleton
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }
}

4. 使用@Inject注解

现在,你可以使用@Inject注解来注入依赖:

@HiltViewModel
class MyViewModel @Inject constructor(
    private val apiService: ApiService
) : ViewModel() {

    fun fetchData() {
        // Use apiService to fetch data
    }
}

在Activity或Fragment中使用注入的ViewModel:

@AndroidEntryPoint
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel.fetchData()
    }
}

5. 生命周期相关的组件

Hilt支持多种Android组件,并且能够管理这些组件的生命周期。例如,@InstallIn(ActivityComponent::class)表示依赖将在Activity的生命周期内存在。

@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {

    @Provides
    fun provideActivityDependency(): ActivityDependency {
        return ActivityDependency()
    }
}

在Activity中注入依赖:

@AndroidEntryPoint
class MyActivity : AppCompatActivity() {

    @Inject
    lateinit var activityDependency: ActivityDependency

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Use activityDependency
    }
}

Hilt的原理

Hilt构建于Dagger2之上,因此其工作原理与Dagger是类似的。它通过一系列注解生成编译时代码来实现依赖注入。总结如下:

1、 模块(Module)和提供者(Provider Method):通过注解创建模块和提供者方法,并使用Dagger编译器生成相关代码。
2、 组件(Component):Hilt自动生成不同生命周期作用域的组件,这些组件负责管理实例的生命周期。
3、 注入点(Injection Site):通过注解确定类的哪些部分需要注入依赖,并在运行时由Hilt提供实例。

通过这种方式,Hilt大幅简化了Android应用中的依赖注入过程,减少了手动编写组件和模块所需的代码,并提高了代码的可读性和可维护性。

总结起来,Hilt提供了一种简洁且强大的方式来管理依赖,特别适合于Android开发的场景。希望这个介绍对你理解和使用Hilt有所帮助!


欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream

标签:依赖,Jetpack,Hilt,库中,组件,注解,Android,class
From: https://blog.csdn.net/myth13141314/article/details/142117667

相关文章

  • timm库中最强的各类模型,图像分类
    vit_base_patch16_224链接:https://huggingface.co/timmtimmTop-20ImageNet-1kModelstimm/eva02_large_patch14_448.mim_m38m_ft_in22k_in1k  ......
  • c++标准库中对文件读写的函数与类
    在C++中,标准库提供了一组文件操作的函数和类,可以用来处理文件的读取、写入、打开、关闭等操作。主要使用的库是<fstream>和<cstdio>。以下是详细的举例说明:1.使用<fstream><fstream>提供了三个主要的类用于文件操作:std::ifstream:用于文件读取。std::ofstream:用于文......
  • postgres数据库中如何看查询是否走索引,以及在什么情况下走索引
    在PostgreSQL中,可以通过EXPLAIN或EXPLAINANALYZE查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。1.如何查看查询是否使用索引使用EXPLAIN查看查询计划EXPLAIN显示PostgreSQL如何执行查询,包括是否使用索引。E......
  • 【EBS】Oracle EBS数据库中的表空间
      在OracleEBSR12系统中,在安装完毕OracleEBS套件之后,根据OracleEBS的可选数据库模型OATM(OracleApplicationsTablespaceModel),在其后台数据库中一般会自动创建19个表空间,包括:TablespaceNameDescriptionAPPS_TS_ARCHIVE包含已归档的清理相关数据的表空间......
  • 谈一谈数据库中的死锁问题
    文章目录死锁是什么?死锁的四个必要条件避免死锁的策略本篇文章是基于《MySQL45讲》来写的个人理解与感悟。死锁是什么?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。若无外力作用,它们都将无法推进下去。此时称系......
  • 聊一下Jetpack AppStartUp的使用和原理。
    AppStartup是AndroidJetpack中的一个库,用于在应用启动时初始化组件,能简化启动序列并显式设置初始化依赖顺序,从而提高应用的启动速度。以下是关于AppStartup的使用和原理的介绍:使用方法添加依赖:在项目的模块级build.gradle文件中添加对AppStartup的依赖。implementatio......
  • 《JavaEE进阶》----9.<SpringMVC实践项目:【简易对话留言板(数据存在数据库中)】>
    本篇博客讲解设计的一个网页版简易对话留言板。这个是将数据存在数据库中。我们通过链接本地数据库。在这里面存入的数据。此时数据存在在硬盘中,只要数据不被删除,硬盘不损坏。那么这些数据就会被永久保存引入的依赖:配置数据库:spring:datasource:#数据库连接配置......
  • VBA数据库解决方案第十四讲:如何在数据库中动态删除和建立数据表
    《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64......
  • python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存及转
    一、python读取txt文本文件-批量更改mysql数据库中一批用户的用户名的python脚本保存    做一个简单的事:使用python读取一个txt文件,里面存储着N行用户id,需要一行行读取后再读取另一个存储用户昵称的txt文件,判断昵称是否有重复,如果没有重复就将数据库中的当前uid用户的昵称......
  • 网站提示500.19 服务器错误:该文件的数据在配置数据库中配置不正确怎么办
    当网站提示 500.19InternalServerError 并指出“该文件的数据在配置数据库中配置不正确”时,这通常意味着IIS(InternetInformationServices)服务器上的配置文件(如 web.config)存在问题。这类错误通常与配置文件的格式、权限或内容有关。以下是解决 500.19InternalServ......