5. 【浅入深出明确 dagger、Hilt】 - Hilt进阶之MVVM

计算机软件开发 2024-9-22 11:02:16 82 0 来自 中国
该章站在企业项目角度上怎样在MVVM框架上完满而且公道的利用Hilt。
以是假如没相识MVVM的结构发起可以直接忽略这章。大家知道,MVVM内里View和Model之间有关联,假设一个场景View触发一个点击事件调用Model查询,然后Model会调用相干Http类进行查询,返回数据给Model,Model再返回数据给View。
固然上述表达的不是严格意义的MVVM,但是流程相仿,重要是解说怎样注解Model和相干Http类,让他们主动天生
让我们先看看有哪些类

类名表明MyApplicationapp的入口MainActivity顾名思义就是展示的ViewViewModelMainActivity对应的ViewModel,也是MVVM中的ModelTestApi一个仿造Http的类,只是单纯返回一个数据NetworkModule一个制造类,Hilt通过标志主动探求相干类,然后会找到该类调用相干函数实例化TestApi那么让我们直接快速解说

1. 在Project的build.gradle添加引入

    dependencies {        ...        classpath "com.google.dagger:hilt-android-gradle-plugin:2.36"    }2. 在module的build.gradle分别两处地方添加

plugins {    ...    id 'kotlin-kapt'    id 'dagger.hilt.android.plugin'}dependencies {    ……    implementation "com.google.dagger:hilt-android:2.37"    kapt "com.google.dagger:hilt-android-compiler:2.37"}好了!添加相干插件主动下载后,我们继承!
3.  HiltAndroidApp标志Application

@HiltAndroidAppclass MyApplication : Application()跟dagger有点不一样的是,必须包罗一个带有 @HiltAndroidApp标志的Application类。
固然,别忘记修改AndroidManifest.xml
<application        android:allowBackup="true"        android:name=".MyApplication"        ...</application>5.  Activity

@AndroidEntryPointclass MainActivity : AppCompatActivity() {    private val viewModel: ViewModel by viewModels()    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        val binding = ActivityMainBinding.inflate(layoutInflater)        setContentView(binding.root)        binding.tvName.append(viewModel.shopBanner.toString())    }}大家看到viewModel就很奇怪,没有标志就能主动天生利用了?实在by viewModels()就已经代表Hilt天生处置处罚了。让我们往下看
4.  创建一个仿造访问网络数据的TestApi 类

class TestApi {    fun getValue(): Int {        return 1    }}只是一个简朴的创建返回数据类
5.  ViewModel

可以同时看到两个标志@HiltViewModel 和 @Inject,那么TestApi在那边实例化呢?Activity也没有创建TestApi呀,这就是Hilt方便的地方,让我们看下一个NetworkModule
@HiltViewModelclass ViewModel @Inject constructor(    testApi: TestApi) : ViewModel() {    val shopBanner = testApi.getValue()}6.  NetworkModule

通过@Module、@InstallIn、@Provides、@Singleton等多个标志,让Hilt探求TestApi的构造方法的时间,找到这里,而且调用GetApi方法创建实例。
@Module@InstallIn(SingletonComponent::class)object NetworkModule {    @Provides    @Singleton    fun GetApi(): TestApi {        return TestApi()    }}7.  End

根本就竣事了,那么大家很奇怪,实在很简朴两句话代码放在MainActivity直接实例化不就行了吗,实在不是如许的,当项目越巨大的时间,大概改变构造函数的时间,那么我们利用Hilt就能很方便的集中在雷同NetworkModule如许的类处置处罚,而在Activity这些类中,我们是不须要关心构造函数的。假如你以为明确还抽象,那么发起先用寻常方式写Mvvm,末了再用Hilt优化这方面,大概会有更深入的明确呢!
标志符解说表格

标志符标志是为了什么@Module标志一个module,代表提供一些无法用构造@Inject的依赖, 比如接口, 第三方库范例, Builder模式构造的对象等@InstallIn委托Hilt帮我们管理范围,以管理对象的生命周期,通过指定 Hilt 组件告诉 Hilt 绑定在哪些容器中可用,有很多种容用具体可以看图1@Provides提供实例,表明函数,以告诉 Hilt 怎样提供无法注入构造函数的 范例@ViewModelScoped当在ViewModel中引入协程,假如直接利用CoroutineScope,那么须要在onCleared()方法中取消协程,假如忘记取消协程那么会导致出现内存走漏等各种题目,此时须要利用ViewModel扩展属性viewModelScope来实现协程作用域作用域

只是简朴先容依赖注入利用方式的实例源码如下:
zhongjhATC/HiltAndDaggerDemo: 演示 Hilt、Dagger 的demo (github.com)
其他相干文章
1. 【浅入深出明确 dagger、Hilt】 - 简介 - 简书 (jianshu.com)
2. 【浅入深出明确 dagger、Hilt】 - dagger无参依赖注入 - 简书 (jianshu.com)
3. 【浅入深出明确 dagger、Hilt】 - dagger有参依赖注入 - 简书 (jianshu.com)
4. 【浅入深出明确 dagger、Hilt】 - Hilt - 简书 (jianshu.com)
在 Android 应用中利用 Hilt  |  Google Developers
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:29, Processed in 0.162223 second(s), 32 queries.© 2003-2025 cbk Team.

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