今天继续Jetpack专题,相信不少的朋友都使用过Dagger,也放弃过Dagger,因为实在太难用了。所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架——Hilt,今天一起来看看:

  • 依赖注入是啥?为什么需要她?
  • Hilt是啥,怎么用?
  • Hilt支持哪些类的依赖注入。

依赖注入是啥?为什么需要她?

简单的说,依赖注入就是内部的类在外部实例化了。也就是不需要自己去做实例化工作了,而是交给外部容器来完成,最后注入到调用者这边,形成依赖注入。

举个例子:

Activity中有一个user类,正常情况下要使用这个user肯定是需要实例化它,不然他是个空值,但是用了依赖注入后,就不需要在Activity内部再去实例化,就可以直接使用它了。


@AndroidEntryPoint
class MainActivity : BaseActivity() {
@Inject
lateinit var user: User
}

这个user就可以直接使用了,是不是有点神奇,都不需要手动依赖了,当然代码没写完,后面再去完善。只是表达了这么一个意思,也就是依赖注入的含义。

那么这种由外部容器来实例化对象的方式到底有什么好处呢?最大的好处就是减少了手动依赖,对类进行了解耦。具体主要有以下几点:

  • 依赖注入库会自动释放不再使用的对象,减少资源的过度使用。
  • 在配置 scopes范围内,可重用依赖项和创建的实例,提高代码的可重用性,减少了很多模板代码。
  • 代码变得更具可读性。
  • 易于构建对象。
  • 编写低耦合代码,更容易测试。

Hilt是啥,怎么用?

很明显,Hilt就是一个依赖注入库,一个封装了Dagger,在Dagger的基础上进行构建的一个依赖注入库。Dagger我们都知道是一个早期的依赖注入库,但确实不好用,需要配置很多东西,那么Hilt简单到哪了呢?我们继续完善上面的例子:

@HiltAndroidApp
public class MainApplication extends Application {
} @AndroidEntryPoint
class HiltActivitiy : AppCompatActivity() { @Inject
lateinit var user: UserData override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) showToast(user.name)
}
} data class UserData(var name: String) {
@Inject
constructor() : this("bob")
}

说下几个注释的含义:

  • @HiltAndroidApp。所有使用Hilt的App必须包含一个使用 @HiltAndroidApp 注解的 Application,相当于Hilt的初始化,会触发Hilt代码的生成。
  • @AndroidEntryPoint。用于提供类的依赖,也就是代表这个类会用到注入的实例。
  • @Inject。这个注解是用来告诉 Hilt 如何提供该类的实例,它常用于构造函数、非私有字段、方法中。

Hilt支持哪些类的依赖注入。

1) 如果是 Hilt 支持的 Android 组件,直接使用 @AndroidEntryPoint注解即可。比如Activity,Fragment,Service等等。

  • 如果是ComponentActivity的子类Activity,那么直接使用@AndroidEntryPoint就可以了,比如上面的例子。
  • 如果是其他的Android类,必须在它依赖的Android类添加同样的注解,例如在 Fragment 中添加@AndroidEntryPoint注解,必须在Fragment依赖的Activity上也添加@AndroidEntryPoint注解。

2)如果是需要注入第三方的依赖,可以使用@Module注解,使用 @Module注解的普通类,在其中创建第三方依赖的对象。比如获取okhttp的实例

@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule { /**
* @Provides
* @Singleton 提供单例
*/
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
} }

这里又有几个新的注解了:

  • @Module。用于创建依赖类的对象
  • @InstallIn。使用 @Module 注入的类,需要使用 @InstallIn 注解指定 module 的范围,例如使用 @InstallIn(ActivityComponent::class) 注解的 module 会绑定到 activity 的生命周期上。
  • @Provides。用于被 @Module注解标记类的内部的方法,并提供依赖项对象。
  • @Singleton。提供单例

3)为ViewModel提供的专门的注解

@ViewModelInject,在Viewmodel对象的构造函数中使用 @ViewModelInject 注解可以提供一个 ViewModel。

class HiltViewModel @ViewModelInject constructor() : ViewModel() {}

private val mHitViewModule: HiltViewModel by viewModels()

参考

https://juejin.im/post/6844904198803292173

拜拜

有一起学习的小伙伴可以关注下️我的公众号——码上积木,每天剖析一个知识点,我们一起积累知识。

最新文章

  1. iOS--cocopod升级新版本
  2. e_msg_c_as_login_req 和 e_msg_c_as_login_if_no_register_req
  3. iOS中NSUserDefaults详解
  4. AngularJS 之 Factory、Service、Provider
  5. java分享第一天(java环境及原理)
  6. linux input输入子系统应用分析
  7. [CSS]三层嵌套的滑动门
  8. vs2012 密匙
  9. SharePoint 2013 中使用 JavaScript Like 和Unlike list item/page/document
  10. 【转载】C#后台声明式验证,远离if验证
  11. Javascript系列之在HTML中使用JavaScript
  12. table 表格隔行换色实现
  13. 启动外部exe程序
  14. Spark中的Scheduler
  15. 异步编程和线程的使用(.NET 4.5 )
  16. java文件处理之压缩,分割
  17. echarts 折线图自定义颜色与修改legend颜色
  18. mysql—常用查询语句总结
  19. 对mysql数据库中字段为空的处理
  20. js中用户名的正则(字符,数字,下划线,减号)

热门文章

  1. Azure Cosmos DB (一) 入门介绍
  2. QT记录
  3. 解决Use 'LimitInternalRecursion' to increase the limit if necessary的问题 CodeIgniter .htaccess
  4. 【漏洞复现】WinRAR目录穿越漏洞(CVE-2018-20250)复现
  5. Arduino读取写入电压值
  6. try with resource当中你没有注意到点。。
  7. php上传图片,网站代码
  8. vue 组件的封装
  9. Cesium资料
  10. day58 Pyhton 框架Django 01