日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android Hilt的使用以及遇到的問(wèn)題

瀏覽:106日期:2022-09-19 09:44:09
簡(jiǎn)介

Hilt 提供了一種將Dagger 依賴注入到Android 應(yīng)用程序的標(biāo)準(zhǔn)方法。為Android 應(yīng)用程序簡(jiǎn)化提供一組標(biāo)準(zhǔn)的、簡(jiǎn)化設(shè)置、可以讀的組件;且為不同類型的構(gòu)建(例如:測(cè)試、調(diào)試、發(fā)行)提供一種簡(jiǎn)單的方法。

可以理解為Google 為了統(tǒng)一依賴注入組件,但是Dagger 用起來(lái)比較復(fù)雜。就針對(duì)Android開(kāi)發(fā)了一套適配庫(kù)。

導(dǎo)入Hilt

apply plugin: ’com.android.application’apply plugin: ’dagger.hilt.android.plugin’android { // ...}dependencies { implementation ’com.google.dagger:hilt-android:2.34.1-beta’ kapt ’com.google.dagger:hilt-compiler:2.34.1-beta’ // For instrumentation tests androidTestImplementation ’com.google.dagger:hilt-android-testing:2.34.1-beta’ kaptAndroidTest ’com.google.dagger:hilt-compiler:2.34.1-beta’ // For local unit tests testImplementation ’com.google.dagger:hilt-android-testing:2.34.1-beta’ kaptTest ’com.google.dagger:hilt-compiler:2.34.1-beta’}kapt { correctErrorTypes true}

設(shè)置correctErrorTypes 為true ,將kapt配置為更正錯(cuò)誤類型 。這里遇到一個(gè)問(wèn)題,當(dāng)我的gradle 版本為 3.4.1 的時(shí)候

classpath ’com.android.tools.build:gradle:3.4.1’

apply plugin: ’dagger.hilt.android.plugin’插件一直安裝失敗,提示找不到 'com/android/Version' 把gradle 改成 4.1.2 就沒(méi)問(wèn)題了且注意 如果你是多module的項(xiàng)目,apply plugin: ’dagger.hilt.android.plugin’ 一定要plugin在主module下(也就是跟 apply plugin: ’com.android.application’ 一起),若是只在子module下,主module的注入不會(huì)被實(shí)現(xiàn)。(問(wèn)題1,后面會(huì)解釋問(wèn)題原因)

buildscript { repositories { // other repositories... mavenCentral() } dependencies { // other plugins... classpath ’com.google.dagger:hilt-android-gradle-plugin:2.34.1-beta’ }}組件層次

Hilt把Dagger 手動(dòng)創(chuàng)建Component 改成了預(yù)定義的Component,且自動(dòng)集成到Android應(yīng)用程序的各個(gè)生命周期中。通過(guò)注解的方式@InstallIn(xxxComponent.class)進(jìn)行綁定。下圖顯示了標(biāo)準(zhǔn)的Hilt組件層次結(jié)構(gòu)。每個(gè)組件上方的注釋是作用域注釋,用于將綁定范圍限制為該組件的生存期。組件下方的箭頭指向任何子組件。通常,子組件中的綁定可以依賴于祖先組件中的任何綁定。

Android Hilt的使用以及遇到的問(wèn)題

組件默認(rèn)綁定

每個(gè)Hilt 組件都帶有一組默認(rèn)綁定,這些默認(rèn)綁定可以作為依賴注入到你自定義綁定中

Component Default Bindings SingletonComponent Application ActivityRetainedComponent Application ViewModelComponent SavedStateHandle ActivityComponent Application, Acitvity FragmentComponent Application, Acitvity, Fragment ViewComponent Application, Acitvity, View ViewWithFragmentComponent Application, Acitvity, Fragment, View ServiceComponent Application, Service 簡(jiǎn)單使用

下面我為大家介紹以下一些注解的使用:

@HiltAndroidApp @AndroidEntryPoint @InstallIn @Module @Provides @Binds @HiltViewModel @EntryPoint

想要了解更多的建議直接查看官方文檔

@HiltAndroidApp介紹

所有使用Hilt的App 必須包含一個(gè)被@HiltAndroidApp 注釋的Appliction 類。@HiltAndroidApp 會(huì)生成一個(gè)Hilt_MyApplication 的基類,并且繼承與@HiltAndroidApp 注釋的類的基類,然后將@HiltAndroidApp 注釋的類的基類替換成Hilt_MyApplication。例如:這是我們應(yīng)用的 MyApplication

@HiltAndroidAppclass MyApplication extends BaseApplication{}

使用@HiltAndroidApp Hilt 將會(huì)生成 Hilt_MyApplication

public abstract class Hilt_MyApplication extends BaseApplication implements GeneratedComponentManagerHolder { private final ApplicationComponentManager componentManager = new ApplicationComponentManager(new ComponentSupplier() { @Override public Object get() { return DaggerMyApplication_HiltComponents_SingletonC.builder() .applicationContextModule(new ApplicationContextModule(Hilt_MyApplication.this)) .build(); } }); @Override public final ApplicationComponentManager componentManager() { return componentManager; } @Override public final Object generatedComponent() { return this.componentManager().generatedComponent(); } @CallSuper @Override public void onCreate() { // This is a known unsafe cast, but is safe in the only correct use case: // MyApplication extends Hilt_MyApplication ((MyApplication_GeneratedInjector) generatedComponent()).injectMyApplication(UnsafeCasts.<MyApplication>unsafeCast(this)); super.onCreate(); }}

并且使我們的 MyApplication 繼承 Hilt_MyApplication,通過(guò)這種方式將modules 注入到我們的應(yīng)用中。可以看到具體的注入方法就是Hilt_MyApplication onCreate() 函數(shù)中的((MyApplication_GeneratedInjector) generatedComponent()).injectMyApplication(UnsafeCasts.unsafeCast(this));這句代碼,generatedComponent() 返回的是 MyApplication_HiltComponents.SingletonC 對(duì)象,這個(gè)對(duì)象中就是我們所有module 的代碼實(shí)現(xiàn)。有興趣的同學(xué)可以自己去看一下,我這里就不貼代碼了

使用

使用分為兩種情況,添加和沒(méi)有添加 Hilt Gradle插件

//沒(méi)有添加插件@HiltAndroidApp(BaseApplication.class)class MyApplication extends Hilt_MyApplication{}//添加插件@HiltAndroidAppclass MyApplication extends BaseApplication{}

建議添加插件,使用起來(lái)會(huì)更簡(jiǎn)單。本文以下的示例都假定以使用插件。這里需要注意的是如果要在MyApplication 中使用注入的對(duì)象,需要在 super.onCreate() 之后才能使用。 原因且看介紹中的 Hilt_MyApplication 源碼。這里解釋一下問(wèn)題1出現(xiàn)的原因,是因?yàn)槲覜](méi)有添加插件但@HiltAndroidApp 使用的時(shí)候用的卻是添加了插件的用法。所以會(huì)出現(xiàn)module 注入不被實(shí)現(xiàn)的情況。

@AndroidEntryPoint介紹

安卓成員注入,使用@AndroidEntryPoint 注解后就可以在該類中使用module注入的成員變量。但@AndroidEntryPoint 有類型限制,只能在以下的類上使用:

Activity Fragment View Service BroadcastReceiver 使用

@AndroidEntryPointpublic final class MyActivity extends MyBaseActivity { // Bindings in SingletonComponent or ActivityComponent @Inject Bar bar; @Override public void onCreate(Bundle savedInstanceState) { // Injection happens in super.onCreate(). super.onCreate(); // Do something with bar ... }}

同樣要注意是是需要在 super.onCreate() 后使用注入的成員變量

@Module 和 @InstallIn介紹

@Module 跟Dagger 里的是同一個(gè),沒(méi)什么好說(shuō)的。@InstallIn 通過(guò)使用@InstallIn(xxxComponent.class) 將module 安裝到指定的組件中,在Hilt 中所以module 都必須添加這個(gè)注釋,如果組件中就找不到這個(gè)module ,可能引起編譯錯(cuò)誤。當(dāng)然一個(gè)module 也可安裝到多個(gè)組件上如:@InstallIn({ViewComponent.class, ViewWithFragmentComponent.class})

使用

@Module@InstallIn(SingletonComponent.class)public final class FooModule { // @InstallIn(SingletonComponent.class) module providers have access to // the Application binding. @Provides static Bar provideBar(Application app) {...}}

每個(gè)組件都帶有作用域注釋,該注釋可用于記住對(duì)組件生存期的綁定。例如,要將范圍綁定到 SingletonComponent組件,請(qǐng)使用@Singleton批注:

@Module@InstallIn(SingletonComponent.class)public final class FooModule { // @Singleton providers are only called once per SingletonComponent instance. @Provides @Singleton static Bar provideBar() {...}}

此外,每個(gè)組件都有默認(rèn)情況下可用的綁定。例如,該SingletonComponent組件提供了Application 綁定:

@Module@InstallIn(SingletonComponent.class)public final class FooModule { // @InstallIn(SingletonComponent.class) module providers have access to // the Application binding. @Provides static Bar provideBar(Application app) {...}}@Provides 和 @Binds介紹

@Provides 注釋Module 中的方法以創(chuàng)建提供者方法綁定。該方法的返回類型綁定到其返回值。@Binds 注釋Module 中的抽象方法,一般方法的返回是一個(gè)接口,參數(shù)是實(shí)現(xiàn)接口的子類,在調(diào)用是會(huì)調(diào)用參數(shù)的子類中的方法實(shí)現(xiàn)。

使用

@Module@InstallIn(SingletonComponent.class)public final class FooModule { @Provides @Singleton static Bar provideBar() {...}}@Module@InstallIn(SingletonComponent.class)public abstract class BindModule { @Binds @Singleton abstract Random bindRandom(SecureRandom secureRandom);}@HiltViewModel介紹

使用 @HiltViewModel 注釋ViewModel,ViewModel 在創(chuàng)建的時(shí)候就會(huì)走Hilt 創(chuàng)建的HiltViewModelFactory 進(jìn)行創(chuàng)建。就可以使用在創(chuàng)建的時(shí)候使用Module 中提供的實(shí)例

使用

@HiltViewModelpublic final class FooViewModel extends ViewModel { @Inject FooViewModel(SavedStateHandle handle, Foo foo) { // ... }}

然后就可以在帶有@AndroidEntryPoint 注解的activity、fragment 中使用了

@AndroidEntryPointpublic final class MyActivity extends AppCompatActivity { private FooViewModel fooViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); fooViewModel = new ViewModelProvider(this).get(FooViewModel.class); }}@EntryPoint介紹

為不能使用注解的地方提供注入的對(duì)象。因?yàn)锧AndroidEntryPoint 使用范圍有限,在這范圍之外要使用Hilt 注入的實(shí)例就可以使用@EntryPoint 來(lái)實(shí)現(xiàn)。這個(gè)像是Hilt 把Component標(biāo)準(zhǔn)化后,使用者不能再里面添加方法,導(dǎo)致不能為使用不了注解的地方提供依賴而做出的解決方案。

@EntryPoint@InstallIn(SingletonComponent.class)public interface FooBarInterface { Bar getBar();}

如果使用上面的定義

Bar bar = EntryPoints.get(applicationContext, FooBarInterface.class).getBar();小結(jié)

一開(kāi)始使用的時(shí)候我看到是 安卓開(kāi)發(fā)平臺(tái)“Hilt 和 Jetpack 集成”這個(gè)文檔,真坑,文檔不及時(shí)更新也不把官方鏈接放一下。吐槽一下。然后幾經(jīng)周轉(zhuǎn)找到了官方文檔才能有幸為大家介紹一下Hilt。使用起來(lái)確實(shí)要比Dagger 舒服的多,少了很多模板代碼,范圍和生命周期的綁定也更好理解。不多bb 學(xué)它

以上就是Android Hilt的使用以及遇到的問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于Android Hilt的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久高清精品| 日韩高清二区| 亚洲精品黄色| av日韩中文| 日韩高清三区| 久久影视一区| 麻豆传媒一区二区三区| 蜜臀av一区二区三区| 欧美丰满日韩| 国产日韩一区二区三区在线| 久久国产成人午夜av影院宅| 国产精品男女| 日韩中文字幕一区二区三区| 亚洲综合电影| 国产精品视频一区视频二区| 国产精品不卡| 欧美日韩国产一区二区在线观看| 亚洲精品2区| 水蜜桃精品av一区二区| 午夜亚洲福利| 日韩午夜av在线| 新版的欧美在线视频| 国产精品2区| 日韩精品一区二区三区中文 | 青青青免费在线视频| 免费视频最近日韩| 欧美日韩中文一区二区| 精品一区二区三区亚洲| 青青草91视频| 中文字幕日韩高清在线 | 日本高清不卡一区二区三区视频| 国产精品一区二区av交换| 亚洲资源在线| 欧美一级专区| 女人天堂亚洲aⅴ在线观看| 日韩在线免费| 久久精品国产成人一区二区三区| 色综合视频一区二区三区日韩 | 久久不射中文字幕| 久久精品国产www456c0m| 国产一区丝袜| 欧美激情三区| 国产欧美视频在线| 日韩亚洲精品在线观看| 亚洲欧美日韩国产一区二区| 99视频精品全国免费| 日韩在线观看一区| 色在线中文字幕| 国产精品久久久久久久久久10秀 | 国产精品中文字幕制服诱惑| 日本在线观看不卡视频| 日韩精品一二三| 亚洲深夜影院| 宅男噜噜噜66国产日韩在线观看| 蜜桃国内精品久久久久软件9| 久久天堂av| 91青青国产在线观看精品| 国产精品视频一区二区三区综合| 欧美日本久久| 日韩一区二区三区免费视频| 午夜亚洲福利| 日韩欧美中文字幕在线视频| 少妇精品久久久一区二区三区| 在线精品亚洲| 日韩精品成人| 国产日韩视频在线| 国产精品一区二区三区www| 国产欧美日韩一区二区三区四区| 欧美久久香蕉| 国产精品毛片视频| 老色鬼精品视频在线观看播放| 精品久久久久久久| 欧美gv在线| 黄色欧美日韩| 欧美不卡高清| 久久香蕉精品| 青青伊人久久| 麻豆国产精品| 97se综合| 99日韩精品| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩精品免费观看视频| 国产精品99精品一区二区三区∴| 国产成人77亚洲精品www| a天堂资源在线| 免费精品国产| 亚洲无线观看| 国产精品高清一区二区| 国产不卡精品| 久久精品欧美一区| 亚洲精品电影| 日本在线成人| 精品免费av一区二区三区| 91精品xxx在线观看| 国产农村妇女精品一二区| 日韩激情av在线| 久久一区欧美| 久久久久久久久久久妇女| 香蕉视频成人在线观看| 欧美一级一区| 日韩电影免费网址| 亚洲专区一区| 国产日韩欧美一区| 日产精品一区| 一区福利视频| 欧美一区成人| 美女福利一区二区三区| 国产精品毛片在线看| 久久精品xxxxx| a日韩av网址| 久久大逼视频| 老色鬼精品视频在线观看播放| 久久精品中文| 日韩一区二区三免费高清在线观看| 欧美激情日韩| 亚洲精品一二三区区别| 青草av.久久免费一区| 美女av在线免费看| 在线国产日韩| 麻豆91在线播放| 蜜桃成人av| 国产精品最新| 免费黄色成人| 国产精品亚洲一区二区在线观看| 日韩精品欧美| 欧美亚洲色图校园春色| 日韩另类视频| 91av一区| 亚洲性图久久| 国产精品亚洲四区在线观看| 亚洲韩日在线| 国产精品久久777777毛茸茸| 亚洲午夜视频| 美女精品一区二区| 午夜一区在线| 久久久久久久欧美精品| 欧洲激情综合| 麻豆精品视频在线| 日韩一级欧洲| 精品日韩一区| 中文字幕日韩亚洲| 日韩欧美另类一区二区| 日韩高清不卡在线| 亚洲高清不卡| 麻豆精品99| 亚洲精品日韩久久| 亚洲国产综合在线看不卡| 久久爱www.| 亚州国产精品| 欧美+亚洲+精品+三区| 国产精品美女在线观看直播| 黄色免费成人| 日韩福利一区| 国产日韩一区二区三免费高清| 亚洲欧洲一区| 日韩欧美一区免费| 国产精品天天看天天狠| 免费精品视频| 99精品在线观看| 成人精品动漫一区二区三区| 日韩不卡一二三区| 久久一二三区| 免费av一区| 日韩精品永久网址| 国产激情欧美| 日韩国产在线一| 国产视频亚洲| 久久久久久美女精品| 精品少妇一区| 国产精品伊人| 亚洲美女久久| 国产精品美女久久久| 亚洲h色精品| 91综合视频| 欧美激情91| 欧美视频精品全部免费观看| 在线免费观看亚洲| 日韩天堂av| 国产韩日影视精品| 日本在线高清| 精品视频高潮| 美女视频黄免费的久久| 国产一区 二区| 91国内精品| 日本精品另类| 亚洲精品一级| 亚洲精品黄色| 亚洲精品激情| 亚洲精品第一| 婷婷成人av| 亚洲精选成人| 亚洲综合小说| 在线观看视频免费一区二区三区| 国产精品日韩久久久| 欧美亚洲在线日韩| 久久国产影院| 久久一级电影| 婷婷亚洲五月| 日韩一级网站| 午夜在线视频观看日韩17c|