我的编程空间,编程开发者的网络收藏夹
学习永远不晚

AndroidHilt依赖注入的使用讲解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

AndroidHilt依赖注入的使用讲解

什么是依赖注入

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

使用依赖注入的好处

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

  • 重用代码
  • 易于重构
  • 易于测试

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

Hilt中常用的预定义限定符

@HiltAndroidApp

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

@HiltAndroidApp
class App : Application() { ... }

@AndroidEntryPoint

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

目前Hilt 支持以下 Android 类:

  • Application(通过使用 @HiltAndroidApp)
  • ViewModel(通过使用 @HiltViewModel)
  • Activity
  • Fragment
  • View
  • Service
  • BroadcastReceiver
@AndroidEntryPoint
class MainActivity : ComponentActivity() {...}

@Module

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

@InstallIn

对于您可以从中执行字段注入的每个 Android 类,都有一个关联的 Hilt 组件,您可以在 @InstallIn 注解中引用该组件。每个 Hilt 组件负责将其绑定注入相应的 Android 类。

Android 组件默认绑定
SingletonComponentApplication
ActivityRetainedComponentApplication
ViewModelComponentSavedStateHandle
ActivityComponentApplication 和 Activity
FragmentComponentApplication、Activity 和 Fragment
ViewComponentApplication、Activity 和 View
ViewWithFragmentComponentApplication、Activity、Fragment 和 View
ServiceComponentApplication 和 Service
@Module
@InstallIn(SingletonComponent::class)
object AppModule {...}

@Provides

如果想要让Hilt知道,提供了哪些实例对象,可以使用@Provides进行注解,以下提供啦一个数据库实例,并且作用域是全局单例

    @Provides
    @Singleton
    fun providerAccountBean():AccountBean{
        return AccountBean("FranzLiszt","123456")
    }

@Inject

如果想要使用Hilt自动进行啦依赖注入的对象,可以使用@Inject注解进行调用;如下,无需进行实例化,它会自动引用providerAccountBean()提供的对象

@Inject lateinit var bean: AccountBean

@HiltViewModel

通过名称就可以了解,它需要与ViewModel类联合使用,作用于ViewModel上;如下,与@Inject结合使用,在构造函数引用啦上述Hilt提供的对象

@HiltViewModel
class AccountViewModel @Inject constructor(private val bean: AccountBean):ViewModel() {...}

Hilt的使用

依赖

第一步:在project/build.gradle中添加如下代码

plugins {
    ...
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}

第二步:在app/build.gradle中添加如下代码

plugins {
    ...
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}

第三步:在app/build.gradle中添加如下代码

   //Dagger - Hilt
    implementation("com.google.dagger:hilt-android:2.44")
    kapt("com.google.dagger:hilt-android-compiler:2.44")

    // Compose dependencies
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-beta01"
    implementation "androidx.hilt:hilt-navigation-compose:1.0.0-alpha03"

第四步:在app/build.gradle中添加如下代码

android{
...
 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

建立实体类

data class AccountBean(var username:String,var password:String)

添加Hilt入口

@HiltAndroidApp
class APP:Application() {}

提供对象

此处作为用例,只是简单写一个测试用例,在函数中可以编写复杂的程序,并不会影响程序性能,在程序初始化编译时会耗时一丢丢。一下提供啦单例AccountBean对象

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    @Singleton
    fun providerAccountBean():AccountBean{
        return AccountBean("FranzLiszt","123456")
    }
}

获取对象

给Activity添加HiltAndroidEntryPoint注解,然后可以通过Inject注解获取上面providerAccountBean方法提供的对象

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    @Inject lateinit var bean: AccountBean
    ...
    }

然后就可以直接进行对象引用

  @Composable
    fun showAccountInfo() {
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = bean.username)
            Spacer(modifier = Modifier.height(20.dp))
            Text(text = bean.password)
        }
    }

应用与ViewModel中

在ViewModel中使用HiltViewModel注解,然后就可以使用Inject注解获取Hilt自动注入依赖的对象

@HiltViewModel
class AccountViewModel @Inject constructor(private val bean: AccountBean):ViewModel() {...}

定义两个具有状态的成员变量,其中AccountState是一个数据类,具有text和hint两个成员变量

private val _usernameState = mutableStateOf(AccountState(
        hint = "input username"
    ))
    val usernameState:State<AccountState> = _usernameState
    private val _passwordState = mutableStateOf(AccountState(
        hint = "input password"
    ))
    val passwordState:State<AccountState> = _passwordState

在ViewModel初始化函数中,将Hilt提供的对象的值赋值给VM中的两个状态变量

init {
        _usernameState.value = usernameState.value.copy(text = bean.username)
        _passwordState.value = passwordState.value.copy(text = bean.password)
    }

通过外部事件进行对应处理,外部输入框不断进行值修改,此处同步给VM中的状态变量

   fun onEvent(event: AccountEvent){
        when(event){
            is AccountEvent.ChangeUsername ->{
                _usernameState.value = usernameState.value.copy(text = event.value)
            }
            is AccountEvent.ChangePassword ->{
                _passwordState.value = passwordState.value.copy(text = event.value)
            }
        }
    }

使用

此处直接获取ViewModel的两个成员变量值,然后与两个输入框进行绑定,通过监听输入框的onValueChange方法,当其值不断修改时,然后调用VM中的onEvent方法,然后修改VM中的状态内容,由于输入框绑定了VM的状态变量,然后状态变量值改变后,相对应的UI界面会进行重组

    @Composable
    fun showAccountInfo (viewModel: AccountViewModel = hiltViewModel()){
        val username = viewModel.usernameState.value
        val password = viewModel.passwordState.value
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            TextField(
                value = username.text,
                placeholder = { Text(text = username.hint)},
                onValueChange = {
                    viewModel.onEvent(AccountEvent.ChangeUsername(it))
                }
            )
            Spacer(modifier = Modifier.height(20.dp))
            TextField(
                value = password.text,
                placeholder = { Text(text = password.hint)},
                onValueChange = {
                    viewModel.onEvent(AccountEvent.ChangePassword(it))
                }
            )
        }
    }

总结

上述的俩个测例,只是使用Hilt提供的便利的冰山一角;Hilt使用起来很方便,而去可以提高代码结构,省去不必要的代码;其中Koin依赖注入库也备受好评,虽然我没有使用过,因为Google推Hilt,就首先入手啦;在性能上,我看了一些其他文章上介绍,大差不差的,所有根据自己需要进行选择。

到此这篇关于Android Hilt依赖注入的使用讲解的文章就介绍到这了,更多相关Android Hilt依赖注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

AndroidHilt依赖注入的使用讲解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

AndroidHilt依赖注入的使用讲解

这篇文章主要介绍了AndroidHilt依赖注入的使用,首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部方法获取对象实例的称为依赖注入
2023-01-16

AndroidHilt依赖注入的实现浅析

依赖注入是一个听起来很“高大上”的概念,但是其实很简单。本来我要接受各种参数自己构造一个对象,现在只接受一个已经实例化的对象直接作为参数
2023-01-28

go依赖注入库samber/do使用示例讲解

samber/do是Go语言的轻量级依赖注入库。本文提供了示例,说明如何使用do创建和使用依赖项容器,包括基础示例和高级功能,如自定义作用域和使用工厂函数。samber/do的优点包括轻量级、快速、无反射、可测试性和类型安全。
go依赖注入库samber/do使用示例讲解
2024-04-02

ASP.NETCore使用AutoFac依赖注入

实现代码1、新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理。using System;using System.Collections.Generic;using System.Linq;using Sys
2023-06-03

Spring依赖注入怎么使用

Spring是一个开源的Java框架,提供了一个容器来管理应用程序的组件并实现了依赖注入(Dependency Injection)。下面是一个简单的示例,展示了如何在Spring中使用依赖注入:1. 创建被注入的类```javapubli
2023-09-26

laravel依赖注入怎么使用

Laravel的依赖注入是一种通过自动解析和解决类之间的依赖关系的机制。下面是在Laravel中使用依赖注入的步骤:1. 声明依赖关系:首先,在你的类的构造函数中声明你需要的依赖关系。例如:```phpuse App\Services\So
2023-09-21

Vue privide 和inject 依赖注入的使用详解

这篇文章主要介绍了Vue privide 和inject 依赖注入的用法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

Java依赖注入容器超详细全面讲解

依赖注入(DependencyInjection)和控制反转(InversionofControl)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例
2023-01-12

Angular中的依赖注入如何使用

这篇文章主要介绍了Angular中的依赖注入如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular中的依赖注入如何使用文章都会有所收获,下面我们一起来看看吧。译者添加:维基百科中指出 -- 在软件
2023-07-04

AndroidButterKnife依赖注入框架使用教程

ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广
2023-02-23

Android依赖注入框架Dagger2的使用方法

Dagger2是一款基于Java的依赖注入框架,可以帮助Android开发者管理和组织应用的依赖关系。通过使用注解和代码生成技术,可以实现自动化的依赖注入,减少手动编写代码的工作量
2023-05-19

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录