设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 哪怕他只唱了几句,哪怕别人不仔细听都听不到他的声音,他还是要固执的在自己的名字后面写上他的名字,从他们两个名字写在一起的第一天起,就注定了一辈子不会分开[爱心]

哪怕他只唱了几句,哪怕别人不仔细听都听不到他的声音,他还是要固执的在自己的名字后面写上他的名字,从他们两个名字写在一起的第一天起,就注定了一辈子不会分开[爱心] -- 怎么了,没什么

查看: 1328|回复: 3

Android Hilt依赖注入的使用讲解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:226
  • 打卡月天数:0
  • 打卡总奖励:3389
  • 最近打卡:2025-04-22 10:51:52
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
388
主题
362
精华
0
金钱
4542
积分
804
注册时间
2022-12-30
最后登录
2025-4-22

发表于 2023-4-11 12:05:12 | 显示全部楼层 |阅读模式
什么是依赖注入

首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部方法获取对象实例的称为依赖注入;而依赖注入又可以简单分为手动注入和自动注入两种方式;Hilt就是基于Dagger进行场景化优化的一个依赖注入库,Hilt是Google专门为Android平台打造的一个依赖注入库,在使用上极大程度进行啦简化(与dagger相比)

使用依赖注入的好处

Google文档中介绍的优势如下:

  • 重用代码
  • 易于重构
  • 易于测试
简单来说,在开发中某些内容需要进行层层手动调用,而且需要手动进行实例化;对于Hilt而言,它可以自动进行依赖注入,并且为项目中的每个 Android 类提供容器并自动管理其生命周期;某些需要全局使用的数据,可以通过Hilt进行共享,从而简化代码

Hilt中常用的预定义限定符


@HiltAndroidApp

所有使用 Hilt 的应用都必须包含一个带有
  1. @HiltAndroidApp
复制代码
注解的 Application 类。
  1. @HiltAndroidApp
复制代码
会触发 Hilt 的代码生成操作,生成的代码包括应用的一个基类,该基类充当应用级依赖项容器,记得此Application类要在清单文件中进行引用
  1. @HiltAndroidApp
  2. class App : Application() { ... }
复制代码
@AndroidEntryPoint

如果某个Activity要使用Hilt依赖注入,就必须给Activity添加
  1. @AndroidEntryPoint注解
复制代码
,同理Activity中的某个Fragment也需要使用,也必须添加
  1. @AndroidEntryPoint注解
复制代码

目前Hilt 支持以下 Android 类:

  • Application(通过使用 @HiltAndroidApp)
  • ViewModel(通过使用 @HiltViewModel)
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver
  1. @AndroidEntryPoint
  2. class MainActivity : ComponentActivity() {...}
复制代码
@Module

Hilt带有一个模块的类,使用
  1. @Module
复制代码
注解的类,它会告知Hilt,它提供了哪些实例,通常和
  1. @Provider
复制代码
搭配使用,必须通过
  1. @InstallIn
复制代码
注解为其添加作用域

@InstallIn

对于您可以从中执行字段注入的每个 Android 类,都有一个关联的 Hilt 组件,您可以在
  1. @InstallIn
复制代码
注解中引用该组件。每个 Hilt 组件负责将其绑定注入相应的 Android 类。
Android 组件默认绑定SingletonComponentApplicationActivityRetainedComponentApplicationViewModelComponentSavedStateHandleActivityComponentApplication 和 ActivityFragmentComponentApplication、Activity 和 FragmentViewComponentApplication、Activity 和 ViewViewWithFragmentComponentApplication、Activity、Fragment 和 ViewServiceComponentApplication 和 Service
  1. @Module
  2. @InstallIn(SingletonComponent::class)
  3. object AppModule {...}
复制代码
@Provides

如果想要让Hilt知道,提供了哪些实例对象,可以使用
  1. @Provides
复制代码
进行注解,以下提供啦一个数据库实例,并且作用域是全局单例
  1.     @Provides
  2.     @Singleton
  3.     fun providerAccountBean():AccountBean{
  4.         return AccountBean("FranzLiszt","123456")
  5.     }
复制代码
@Inject

如果想要使用Hilt自动进行啦依赖注入的对象,可以使用
  1. @Inject
复制代码
注解进行调用;如下,无需进行实例化,它会自动引用
  1. providerAccountBean()
复制代码
提供的对象
  1. @Inject lateinit var bean: AccountBean
复制代码
@HiltViewModel

通过名称就可以了解,它需要与
  1. ViewModel
复制代码
类联合使用,作用于ViewModel上;如下,与
  1. @Inject
复制代码
结合使用,在构造函数引用啦上述
  1. Hilt
复制代码
提供的对象
  1. @HiltViewModel
  2. class AccountViewModel @Inject constructor(private val bean: AccountBean):ViewModel() {...}
复制代码
Hilt的使用


依赖

第一步:在
  1. project/build.gradle
复制代码
中添加如下代码
  1. plugins {    ...    id 'com.google.dagger.hilt.android' version '2.44' apply false}
复制代码
第二步:在
  1. app/build.gradle
复制代码
中添加如下代码
  1. plugins {    ...    id 'kotlin-kapt'    id 'dagger.hilt.android.plugin'}
复制代码
第三步:在
  1. app/build.gradle
复制代码
中添加如下代码
  1.    //Dagger - Hilt    implementation("com.google.dagger:hilt-android:2.44")    kapt("com.google.dagger:hilt-android-compiler:2.44")
  2.     // Compose dependencies    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-beta01"    implementation "androidx.hilt:hilt-navigation-compose:1.0.0-alpha03"
复制代码
第四步:在
  1. app/build.gradle
复制代码
中添加如下代码
  1. android{... compileOptions {        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }}
复制代码
建立实体类
  1. data class AccountBean(var username:String,var password:String)
复制代码
添加Hilt入口
  1. @HiltAndroidApp
  2. class APP:Application() {}
复制代码
提供对象

此处作为用例,只是简单写一个测试用例,在函数中可以编写复杂的程序,并不会影响程序性能,在程序初始化编译时会耗时一丢丢。一下提供啦单例
  1. AccountBean
复制代码
对象
  1. @Module@InstallIn(SingletonComponent::class)object AppModule {    @Provides
  2.     @Singleton
  3.     fun providerAccountBean():AccountBean{
  4.         return AccountBean("FranzLiszt","123456")
  5.     }}
复制代码
获取对象

给Activity添加Hilt
  1. AndroidEntryPoint
复制代码
注解,然后可以通过
  1. Inject
复制代码
注解获取上面
  1. providerAccountBean
复制代码
方法提供的对象
  1. @AndroidEntryPoint
  2. class MainActivity : ComponentActivity() {
  3.     @Inject lateinit var bean: AccountBean
  4.     ...
  5.     }
复制代码
然后就可以直接进行对象引用
  1.   @Composable
  2.     fun showAccountInfo() {
  3.         Column(
  4.             verticalArrangement = Arrangement.Center,
  5.             horizontalAlignment = Alignment.CenterHorizontally
  6.         ) {
  7.             Text(text = bean.username)
  8.             Spacer(modifier = Modifier.height(20.dp))
  9.             Text(text = bean.password)
  10.         }
  11.     }
复制代码
应用与ViewModel中

在ViewModel中使用
  1. HiltViewModel
复制代码
注解,然后就可以使用
  1. Inject
复制代码
注解获取Hilt自动注入依赖的对象
  1. @HiltViewModel
  2. class AccountViewModel @Inject constructor(private val bean: AccountBean):ViewModel() {...}
复制代码
定义两个具有状态的成员变量,其中
  1. AccountState
复制代码
是一个数据类,具有text和hint两个成员变量
  1. private val _usernameState = mutableStateOf(AccountState(
  2.         hint = "input username"
  3.     ))
  4.     val usernameState:State<AccountState> = _usernameState
  5.     private val _passwordState = mutableStateOf(AccountState(
  6.         hint = "input password"
  7.     ))
  8.     val passwordState:State<AccountState> = _passwordState
复制代码
在ViewModel初始化函数中,将Hilt提供的对象的值赋值给VM中的两个状态变量
  1. init {
  2.         _usernameState.value = usernameState.value.copy(text = bean.username)
  3.         _passwordState.value = passwordState.value.copy(text = bean.password)
  4.     }
复制代码
通过外部事件进行对应处理,外部输入框不断进行值修改,此处同步给VM中的状态变量
  1.    fun onEvent(event: AccountEvent){
  2.         when(event){
  3.             is AccountEvent.ChangeUsername ->{
  4.                 _usernameState.value = usernameState.value.copy(text = event.value)
  5.             }
  6.             is AccountEvent.ChangePassword ->{
  7.                 _passwordState.value = passwordState.value.copy(text = event.value)
  8.             }
  9.         }
  10.     }
复制代码
使用

此处直接获取ViewModel的两个成员变量值,然后与两个输入框进行绑定,通过监听输入框的
  1. onValueChange
复制代码
方法,当其值不断修改时,然后调用VM中的
  1. onEvent
复制代码
方法,然后修改VM中的状态内容,由于输入框绑定了VM的状态变量,然后状态变量值改变后,相对应的UI界面会进行重组
  1.     @Composable
  2.     fun showAccountInfo (viewModel: AccountViewModel = hiltViewModel()){
  3.         val username = viewModel.usernameState.value
  4.         val password = viewModel.passwordState.value
  5.         Column(
  6.             verticalArrangement = Arrangement.Center,
  7.             horizontalAlignment = Alignment.CenterHorizontally
  8.         ) {
  9.             TextField(
  10.                 value = username.text,
  11.                 placeholder = { Text(text = username.hint)},
  12.                 onValueChange = {
  13.                     viewModel.onEvent(AccountEvent.ChangeUsername(it))
  14.                 }
  15.             )
  16.             Spacer(modifier = Modifier.height(20.dp))
  17.             TextField(
  18.                 value = password.text,
  19.                 placeholder = { Text(text = password.hint)},
  20.                 onValueChange = {
  21.                     viewModel.onEvent(AccountEvent.ChangePassword(it))
  22.                 }
  23.             )
  24.         }
  25.     }
复制代码
总结

上述的俩个测例,只是使用Hilt提供的便利的冰山一角;Hilt使用起来很方便,而去可以提高代码结构,省去不必要的代码;其中
  1. Koin
复制代码
依赖注入库也备受好评,虽然我没有使用过,因为Google推
  1. Hilt
复制代码
,就首先入手啦;在性能上,我看了一些其他文章上介绍,大差不差的,所有根据自己需要进行选择。
到此这篇关于Android Hilt依赖注入的使用讲解的文章就介绍到这了,更多相关Android Hilt依赖注入内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2024-2-22 23:25:30 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2025-4-9 10:18:49 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-25
最后登录
2022-12-25

发表于 4 天前 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表