继续创造,加快生长!这是我参加「日新计划 6 月更文挑战」的第2天,点击查看活动概况
简介
Hilt 是什么?
官方的界说是:
Hilt是Android的依靠项注入库,可削减在项开源节流目中履行手动依靠项注入的样板代码。履行手动依靠项注入要求您手动结构每个类及其依靠项,并借助容器重复运用和办理依靠项。
Hi开源是什么意思lt 经过为项目中的每个 Android 类供给容器并主动办理其生命周期,供给了一种接口卡在运用中运用 DI(依靠项注入)的标准办法。Hilt在热门DI库Dagger的基础上构建而成,因而能够受益于 Dag数据库系统工程师ger 的编数据库原理译时正确性、运行时功用、可伸缩性和And上下文字间距怎么调roid St接口自动化udio 支撑。如需了解概况,请参阅Hilt 和 Dagger。
所以,Hilt是一个对Dagger
库的扩展。那Hilt关于Dagger
的优势首要在于Hilt与Jetpack
库和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
注释httpclient的Application
类。
@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仅支撑扩展
ComponentActivity
onentActivity)的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 ) { }
在一个类的代码中,带有注释的结构函数的参数即是该类的依靠项。在本例中AnalyticsService
是AnalyticsAdapter
的一个依靠项。因而,Hilt还有必要知道怎么供给AnalyticsService
的实例。
留意:在构建时,Hilt会为
Android
类生成Dagger
组件。然后,Dagger
会走查您的代码,并履行以下步骤:
- 构建并验证依靠联系图,确保没有未满足的依靠联系且没有依靠循环。
- 生成它在运行时用来创立实践目标及其依靠项的类。
H开源矿工ilt模块 @Module
有时,类型不能经过结构函数注入。产生这种状况或许有多种原因。例如,您不能经过结构接口函数接口自动化注入接口。此外,您也不能经过结构函数注入上下文英语不归您一切的类型,如来自外部库的类。在这些状况下,您能够运用Hilt @Module
向Hilt供给绑定信息。比如咱们常用于创立依靠类的目标(例如第三方库OkHttp
、Retrofit
等等),运用@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下载安装onent | Application |
ActivityRetainedCom数据库软件ponent | ViewModel |
ActivityComponent | Activit数据库设计y |
FragmentComponent | Fragm数据库有哪几种ent |
ViewComponent | View |
ViewWit数据库原理hhttp://192.168.1.1登录FragmentComponent | View annotated with @WithFragmentBindings |
ServiceComponent | Service |
留意: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 注入实例
除了接口无法经过结构函数注入实例外开源节流是什么意思,还有第三方库如:Retrofit
、OkHttpClient
或Room
数据库等都是无法经过结构函数注入,这时就需求运用@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供给了一些预界说的限定符。例如,因为咱们或许需求来自运用或Activity
的Context
类,因而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支数据库有哪几种撑最常见的Android
类Application
、Activity
、Fragment
、V上下文英语iew
、S数据库ervice
、BroadcastReceiver
等等,但是咱们或许需求在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
注释的Activity
或Fragment
能够运用数据库有哪几种ViewModelProvide接口卡r
或by 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,无法评判Hilt和Dagger的优劣势,社区中很多同学说Dagger学习的成本非常高,并且难用,所以这也是为什么Android
开发团队基于Dagger开发了Hilt这个结构。有一点比较清楚明了的是,Hilt 集成了Jetpack
库和Android
结构类数据库原理,并主动办理它们的生命周期,这让开发者只用关注怎么绑定就好,确实方便了咱们的学习和运用。这篇文章仅仅介绍学习了Hilt的概念和一些根本运用,后续会考虑在之前开源的WanAndroid项目用上。项接口自动化目中的大多数知识点都来自官网开源节流,如有过错,烦请纠正,谢谢。
评论(0)