使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)下

简介: 使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)

为什么是Hilt?


  如果你之前了解过安卓端依赖注入相关的框架,那么你肯定听过Okio,Dagger2,Hilt这三个框架,那么为什么选择Hilt呢,我的理由如下:

  1. Hilt基于Dagger2封装的框架,即在Dagger2的基础上加了一些安卓的场景化配置,也就是说,使用Hilt可以完成Dagger2的工作,同时避免了安卓场景下的部分模板代码。
  2. Hilt是Jetpack组件,和其他Jetpack组件协作良好,例如ViewModel,Compose,WorkManager都可以和Hilt无缝协作。


Hilt的初体验


给顶层的build.gradle添加插件


buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
    }
}

给所有使用Hilt的Module对应的gradle添加如下配置:


apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
dependencies {
    implementation "com.google.dagger:hilt-android:2.28-alpha"
    kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}

给项目的Application添加注解@HiltAndroidApp,添加这个注解的含义是给Application生成一个顶级容器,容器的生命周期跟随Application。


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

接下来,我们要给对应的android组件提供依赖(也就是对组件完成参数传递的),使用注解@AndroidEntryPoint,以Activity为例。


@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { ... }

  然后,我们就可以给Activity注入我们想要的依赖了,例如注入一个Adapter,使用@Inject注释添加到我们想要注入的属性上面(切记,被注入的属性不能是private否则会报错)。


@AndroidEntryPoint
class ExampleActivity:AppCompatActivity() {
    //注入,不用手动实例化
    @Inject
    lateinit var analyticsAdapter: AnalyticsAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //直接调用对象,没有实例化代码
        analyticsAdapter.analytics()
    }
}
class AnalyticsAdapter{
    fun analytics(){}
}

  非常神器,我们并没有看到adapter有被初始化的地方了,因为Hilt帮我们完成了初始化,也就是帮我们完成了Adapter的依赖注入!


  然而当你满心欢喜的尝试去运行上面这段代码的时候,崩溃了!错误是analyticsAdapter并没有被正确实例化,这是什么原因呢,道理很简单:我们只是告诉了Hilt,我们需要一个AnalyticsAdapter,但是Hilt却并不知道AnalyticsAdapter该如何创建,解决问题也很简单,我们告诉Hilt如何创建它不就好了。

  我们给AnalyticsAdapter的构造方法添加一个@Inject注释,告诉Hilt我们用空的构造方法来构建AnalyticsAdapter。

image.png

  代码能运行了!

  同时细心的发现代码左侧出现了两个小图标,这是一开始添加的插件的功能,点击一下AnalyticsAdapter对象左侧有红色向上箭头的图标,会发现跳转到了AnalyticsAdapter的构造函数;点击AnalyticsAdapter构造函数左侧的3个灰方块组成的小图标,则跳转到了AnalyticsAdapter对象。

  上诉操作说明了当我们点击被注入的对象左侧的小图标的时候,实际上我们是在尝试“查找注入的来源”,当我们点击构造函数左侧的小图标的时候,实际上我们是在尝试“查找注入的去向”,通过这两个小图标我们可以快速查找到当前的对象是如何被注入的。

  此刻,项目经理出现了,让我们添加某个功能,体现在代码中则是,Adapter需要外部传入一个对象,于是我们新增一个成员属性到AnalyticsAdapter的构造函数中去。

image.png

  运行程序,不出意外的崩溃了。复盘原因,非常简单,因为我们告诉了Hilt如何创建AnalyticsAdapter,即使用它的带参构造函数去构建,但是Hilt在调带参构造函数的时候,发现自己不懂如何创建NetworkService。

  参考当初构建AnalyticsAdapter的方式,我们继续给NetworkService的构造参数也添加一个@Inject注解,熟悉的图标又出现了,Hilt这回懂得了如何正确创建NetworkService。

image.png

  运行代码,正确!好的,刚才给Adapter新增了一个成员属性,让我们再看看Activity的代码,完全没有发生变化。

image.png

  我们通过了Hilt来帮我们完成了参数的传递(注意,只是辅助完成了这个过程并不是消灭了参数传递),对于Activity来说,他只是需要Adapter,他并不在乎Adapter的内部构建过程,所以Adapter内部再怎么发生剧烈的变化,Activity的代码都是不用去修改的,非常的完美。

课后小练习

下面提供两个小练习让你去体验使用Hilt实现依赖注入的低耦合性

1.给AnalyticsAdapter扩充第二个成员变量,类型为你自己定义的类(可以参考NetworkService)

2.给NetworkService增加一个成员变量

好了,本文到此就结束,关于Hilt的话题我们才刚刚起步,还有许多问题等待着我们去解决,例如如何注入一个接口?那些我们不能修改代码的第三方类如何注入(因为不能修改构造函数)?如何保证注入的都是同一个对象(实现单例)?那么下期我将更详细地逐一解决这些问题。


目录
打赏
0
0
0
0
1
分享
相关文章
带你了解Android Jetpack库中的依赖注入框架:Hilt
本文介绍了Hilt,这是Google为Android开发的依赖注入框架,基于Dagger构建,旨在简化依赖注入过程。Hilt通过自动化的组件和注解减少了DI的样板代码,提高了应用的可测试性和可维护性。文章详细讲解了Hilt的主要概念、基本用法及原理,帮助开发者更好地理解和应用Hilt。
144 8
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(三)
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(三)
249 0
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
【Android 从入门到出门】第三章:使用Hilt处理Jetpack Compose UI状态
96 4
Android OkHttp+Retrofit+Rxjava+Hilt实现网络请求框架
🔥 介绍 本文通过OkHttp+Retrofit+Rxjava+Hilt实现一个网络请求框。
797 0
Android OkHttp+Retrofit+Rxjava+Hilt实现网络请求框架
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(四)
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(四)
284 0
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)下
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)
137 0
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)上
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(二)
153 0
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)上
使用Hilt完成依赖注入,让你的安卓代码层次有几层楼那么高(一)
113 0
Android Jetpack 浅析Hilt依赖注入
首先,某个类的成员变量称为依赖,如若此变量想要实例化引用其类的方法,可以通过构造函数传参或者通过某个方法获取对象,此等通过外部方法获取对象实例的称为依赖注入;而依赖注入又可以简单分为`手动注入`和`自动注入`两种方式;`Hilt`就是基于Dagger进行`场景化优化`的一个依赖注入库,Hilt是Google专门为Android平台打造的一个依赖注入库,在使用上极大程度进行啦简化(与dagger相比)
441 1

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
    22
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    29
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    4
  • 4
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    8
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    64
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    19
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    9
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    16
  • 9
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    35
  • 10
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    10
  • 1
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    16
  • 2
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    35
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    69
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    34
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    50
  • 6
    Android历史版本与APK文件结构
    141
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    42
  • 8
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    36
  • 9
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    63
  • 10
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    45
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等