重学Android Jetpack(九)—Hilt基本使用

继续创造,加快生长!这是我参加「日新计划 6 月更文挑战」的第2天,点击查看活动概况

简介

Hilt 是什么?

官方的界说是:

Hilt是Android的依靠项注入库,可削减在项开源节流目中履行手动依靠项注入的样板代码。履行手动依靠项注入要求您手动结构每个类及其依靠项,并借助容器重复运用和办理依靠项。

Hi开源是什么意思lt 经过为项目中的每个 Android 类供给容器并主动办理其生命周期,供给了一种接口卡在运用中运用 DI(依靠项注入)的标准办法。Hilt在热门DI库Dagger的基础上构建而成,因而能够受益于 Dag数据库系统工程师ger 的编数据库原理译时正确性、运行时功用、可伸缩性和And上下文字间距怎么调roid St接口自动化udio 支撑。如需了解概况,请参阅Hilt 和 Dagger。

所以,Hilt是一个对Dagger库的扩展。那Hilt关于Dagger的优势首要在于HiltJetpack库和A接口crc错误计数ndroid Framehttp代理work的类是集成在一起的,并删除了大部分样板代码,咱们只需专心于界说和注入绑定的部分。

为什么需接口测试求运用依靠注上下文什么意思入?

运用依靠注入开源节流有以下的长处:

  • 简化 Android 运用的 Dagger 相关基础架构。
  • 创立一组标准的组件和作用域,以简化设置、提高可读性以及在运用之间共享代码。
  • 供给一种简略的办法来为各种构建类型(如测验、调试或发布)配置不同数据库的绑定。

Hilt依靠

hilt-android-gradle-plugin插件依靠,在项目级的build.gradle文件中增加:

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

运用层级的app/build.gradle文件中增加以下依靠项:

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

因为Hilt运用Java 8功用,需在项目中启用 Java 8,在app/build.gradle文件中增加:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Hilt常用注解介绍

Hilt常用注解首要是:@HiltA数据库系统概论第五版课后答案ndroidApp@AndroidEntryPoint@Inject@Module@InstallIn@Binds@Provides@EntryP接口oint 等等。

Hilt 运用类@H开源节流是什么意思iltAndroidApp

一切运用Hilt的运用都有必要包括一个带有@HiltAndroidApp注释httpclientApplication类。

@HiltAndroidApp
class HiltApp : Application() {
    override fun onCreate() {
        super.onCreate()
    }
}

首要增加了@HiltAn数据库软件dro执行上下文idApp会触发Hilt的代码生成操作,生成的代码包括数据库原理运用的一个基类,该基类充任运用级依靠项容器http代理。生成的这一Hilt组件会附加到Application目标的生命周期,并为其供给依靠项。此外,它也是运用的父组件,这意味着,其他组件能够访问它供给的依靠项。
HiltApp中设置好@HiltAndroidApp之后,就能够开源阅读运用Hilt供给的组件了,组件包括Application上下文英语、Activity、Fragment、View、Service、BroadcastReceiver等。

将依靠项注入Android类 @Androi数据库原理dEntryPoint

Application类中设置了Hilt且有了运用级组件后,Hilt能够为带有@AndroidEntryPoint注释数据库设计的其他Android类供给依靠项:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Hilt现在支撑以下Android类:

  • Application(经过http 404运用@HiltAndroidApp
  • Activity
  • Fragment
  • V数据库管理系统iew
  • Service
  • BroadcastReceiver

假如咱们要运用@AndroidEnt数据库设计ryPoint为某个Android类增加注释,则还有必要为依靠于该类的Android类增加注释。例如,假接口英文如给一个Fragment增加注释,则还开源代码网站github有必要为http协议运用该 Fragment的一切Activity增加注释。

留意:在 Hilt 对 Android 类的支撑方面还要留意以下几点:

  • Hilt仅支撑扩展ComponentActivityonentActivity)的Activity,如AppCompatAc数据库管理系统tivity
  • Hilt仅支撑扩展androidx.Fragment接口文档Fragment。
  • Hilt不支撑保留的Fragment。

@Inject

@AndroidEntryPoint会为项目中的每个Android类生成一个单独的Hilt组件。这些组件能够从它们各自的父类接纳依靠项,如组件层次结构https和http的区别中所述。

如需从组件获取依靠项,能够运用@Inject注释履行字段注入:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var analytics: AnalyticsAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Hilt注入的字段不能为私有字段。测验运用Hilt注入私有字段会导致编译过错。

Hilt 注入的类能够有同样运用注入的其他基类http协议。假如这些类是笼统类,则它们不需求@AndroidEhttp 302ntryPoint注释。

为了履行字段注入,Hilt需求知道怎么从相应组件供给必要依靠项的实例。绑定包括将某个类型的数据库系统概论第五版课后答案实例作为依靠项供给所需的信息。向Hilt供给绑上下文图定信息的一种办法是结构函数注入。在某个类的结构函数中运用@Inject注释,以奉告Hilt怎么供给该类的实例:

class AnalyticsAdapter @Inject constructor(
 private val service: AnalyticsService
) { }

在一个类的代码中,带有注释的结构函数的参数即是该类的依靠项。在本例中AnalyticsServiceAnalyticsAdapter的一个依靠项。因而,Hilt还有必要知道怎么供给AnalyticsService的实例。

留意:在构建时,Hilt会为Android类生成Dagger组件。然后,Dagger会走查您的代码,并履行以下步骤:

  • 构建并验证依靠联系图,确保没有未满足的依靠联系且没有依靠循环。
  • 生成它在运行时用来创立实践目标及其依靠项的类。

H开源矿工ilt模块 @Module

有时,类型不能经过结构函数注入。产生这种状况或许有多种原因。例如,您不能经过结构接口函数接口自动化注入接口。此外,您也不能经过结构函数注入上下文英语不归您一切的类型,如来自外部库的类。在这些状况下,您能够运用Hilt @ModuleHilt供给绑定信息。比如咱们常用于创立依靠类的目标(例如第三方库OkHttpRetrofit等等),运用@Module注解的类,需求运用@接口类型InstallIn注解指定数据库查询语句module的规模。

@Module
@InstallIn(SingletonComponent::class)
// 把NetworkModule绑定到HiltApp 的生命周期。
object NetworkModule {
}

@InstallIn

运用@Module注入的类,需求运用@InstallIn注解指定module的规模,例如运用 @InstallIn(HiltApp::class)注解的module会绑定到activity的生命周期上。
Hilt供给了以下组件来绑定依靠与对应的Android类的活动规模:

Hilt 供给的组件对应的 Androi执行上下文d 类的活动规模
Singletonomp开源阅读app下载安装onentApplication
ActivityRetainedCom数据库软件ponentViewModel
ActivityComponentActivit数据库设计y
FragmentComponentFragm数据库有哪几种ent
ViewComponentView
ViewWit数据库原理hhttp://192.168.1.1登录FragmentComponentView annotated with @WithFragmentBindings
ServiceComponentService

留意:Hilt 没有为 broadcast r数据库系统工程师eceivers 供给组件,因为 Hilt 直接接口文档从 Applic数据库设计ationComponent 注入 broadcast receivers。

@Binds 注入接口实例

接口是无法经过结构办法进行注入的,需求经过在Hilt 模块内创立一个带有@上下文切换Binds注释的笼统函数进行注入。@Binds注释会奉告Hilt在需求供给接口的实例时要运用哪种完成。

带有注释的函数会向Hilt供给以下信息:

  • 联系上下文数回来类型会奉告Hilt函数供给哪个接口的实例开源软件
  • 函数参数会奉告Hilt要供给哪种完成。

看下面代码:

interface AnalyticsService {
 fun analyticsMethods()
}
// 结构函数也需求注入,因为Hilt需求知道怎么供给AnalyticsServiceImpl的实例。
class AnalyticsServiceImpl @Inject constructor(
 ...
) : AnalyticsService { ... }
@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {
 @Binds
 abstract fun bindAnalyticsService(
  analyticsServiceImpl: AnalyticsServiceImpl
 ): AnalyticsService
}

其间的http 302Hilt模块Anal开源阅读yticsModule开源节流是什么意思带有@InstallIn(ActivityComponent::class)注释,这是表明要Hilt 将该依靠项注入ExampleActivity

@Provides 注入实例

除了接口无法经过结构函数注入实例外开源节流是什么意思,还有第三方库如:RetrofitOkHttpClientRoom数据库等都是无法经过结构函数注入,这时就需求运用@Provides注入实例。看如下代码:

@Module
@InstallIn(SingletonComponent::class)
// 把NetworkModule绑定到HiltApp 的生命周期。
object NetworkModule {
    @Provides
    fun getApiService() : ApiService{
        return Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com")
            .build()
            .create(ApiService::class.java)
    }
}

带有@Provides注释的函数会向 Hilt 供给以下信息:

  • 函数回来类型会奉告H数据库ilt函数供给哪个类型的实例;
  • 函数开源是什么意思参数会奉告Hilt相应类型的依靠开源是什么意思项;
  • 函数主体会奉告Hilt怎么供给相应类型的实例。每逢需求供给该类型的实例时,Hilt 都会履行函数主体。

Hilt 中的预界说限定符

Hilt供给了一些预界说的限定符。例如,因为咱们或许需求来自运用或ActivityContext类,因而Hilt供给了@App开源软件licationContext@Activhttps和http的区别ityContext限定符。

假定下面比如中的AnalyticsAdapter类需求Activity上下文。以下代码演示了怎么向AnalyticsAdapter供给Activity上下文:

class AnalyticsAdapter @Inject constructor(
  @ActivityContext private val context: Context,
  private val service: AnalyticsService
) { }

@Entry开源Point注解

Hilt数据库有哪几种撑最常见的AndroidApplicationActivityFragmentV上下文英语iewS数据库erviceBroadcastReceiver 等等,但是咱们或许需求在Hilt 不支撑的类中履行依靠注入,在这种状况下能够运httpclient@EntryPoi接口类型nt注解进行创立,Hilt会供给相应的依靠。

Hilt的根本运用

根本的Android组件中运用

先创立一个HiltSample类,并运用@数据库系统的核心是Inject注解润饰结构办数据库查询语句法,这时告联系上下文Hilt怎么供给该类的实例,@Inject常用于结构函数、非私有字段、办法中。

class HiltSample @Inject constructor() {
    companion object{
        val TAG = HiltSample::class.simpleName
    }
    fun hiltTodo(str: String){
        Log.e(TAG,str)
    }
}

创立Fragment并增加注解和过@Inject获取HiltSample实例:开源矿工

/**
 * 注解 fragment后,它依靠的activity也需求注解
 */
@AndroidEntryPoint
class MainFragment : Fragment() {
    @Inject
    lateinit var hiltSample: HiltSample
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View? {
        return inflater.inflate(R.layout.fragment_main, container, false)
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        hiltSample.hiltTodo("MainFragment")
    }
}

Activity中运用MainFragment

/**
 * 为项目中的每个Android类生成一个Hilt组件,这些组件能够从它们各自的父类接纳依靠项
 *
 * 笼统类不可运用@AndroidEntryPoint进行注解
 */
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        supportFragmentManager.beginTransaction()
            .add(R.id.container, MainFragment::class.java, null)
            .commit()
    }
}

Hilt在第三方库中的运用

在项目中注入第三方库类组件的依靠,咱们需求运用@Module注解,并在运用@Module注解的类中创立第三方开源阅读app下载安装依靠的目标。

@Module
@InstallIn(SingletonComponent::class) // 把NetworkModule绑定到HiltApp 的生命周期
object NetworkModule {
    @Provides
    @Singleton
    fun getOkHttpClient() : OkHttpClient{
        return OkHttpClient.Builder().build()
    }
    @Provides
    @Singleton
    fun createRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("https://www.wanandroid.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
    @Provides
    @Singleton
    fun getApiService() : ApiService{
        return createRetrofit(getOkHttpClient()).create(ApiService::class.java)
    }
}

这儿要留意两点:

  • 运用 @Module 注入的类,需求运用 @InstallIn 注解指定 module 的规开源众包模,会绑定到 Android 类对应的生命周期上。
  • @数据库系统概论第五版课后答案Provides 常用于被 @Module 注解符号类的内部的办法,并供给依靠项目标。

Hilt在ViewModel的运用

先增加ViewModel的依靠:

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0'

透过运用@HiltViewModel增加注释, 并在ViewModel目标的结构函数中运用@Inject注释来供给一个ViewModel

@HiltViewModel
class HiltViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
    private val repository: HiltRepository,
) : ViewModel() {
}

然后,带有@AndroidEntryPoint注释的ActivityFragment能够运用数据库有哪几种ViewModelProvide接口卡rby viewModels()KTX扩展照常获取开源代码网站githubViewModel实例:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
 private val hiltViewModel: HiltViewModel by viewModels()
 ...
}

Hilt与Room的结合运用

Hilt中咱们只需运用注解@Modul数据库系统的核心是e创立Roomhttp 404Module文件,运用@InstallIn注解指定module的生命周期,例如运用@InstallIn(Shttp代理ingletonComponent::class)注解 module会绑定到Application的生命周上下文字间距怎么调期上:

@Module
@InstallIn(SingletonComponent::class)
// SingletonComponent把RoomModule 绑定到 Application的生命周期。
object RoomModule {
    @Provides
    @Singleton
    fun provideAppDataBase(application: Application): AppDataBase {
        return Room
            .databaseBuilder(application, AppDataBase::class.java, "dhl.db")
            .fallbackToDestructiveMigration()
            .allowMainThreadQueries()
            .build()
    }
}

总结

因为之前没有运用过Dag开源中国ger,无法评判HiltDagger的优劣势,社区中很多同学说Dagger学习的成本非常高,并且难用,所以这也是为什么Android开发团队基于Dagger开发了Hilt这个结构。有一点比较清楚明了的是,Hilt 集成了Jetpack库和Android结构类数据库原理,并主动办理它们的生命周期,这让开发者只用关注怎么绑定就好,确实方便了咱们的学习和运用。这篇文章仅仅介绍学习了Hilt的概念和一些根本运用,后续会考虑在之前开源的WanAndroid项目用上。项接口自动化目中的大多数知识点都来自官网开源节流,如有过错,烦请纠正,谢谢。

发表回复

提供最优质的资源集合

立即查看 了解详情