电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android Hilt的使用以及遇到的問題

瀏覽:45日期:2022-09-19 09:44:09
簡介

Hilt 提供了一種將Dagger 依賴注入到Android 應用程序的標準方法。為Android 應用程序簡化提供一組標準的、簡化設置、可以讀的組件;且為不同類型的構建(例如:測試、調試、發行)提供一種簡單的方法。

可以理解為Google 為了統一依賴注入組件,但是Dagger 用起來比較復雜。就針對Android開發了一套適配庫。

導入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}

設置correctErrorTypes 為true ,將kapt配置為更正錯誤類型 。這里遇到一個問題,當我的gradle 版本為 3.4.1 的時候

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

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

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

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

Android Hilt的使用以及遇到的問題

組件默認綁定

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

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 簡單使用

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

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

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

@HiltAndroidApp介紹

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

@HiltAndroidAppclass MyApplication extends BaseApplication{}

使用@HiltAndroidApp Hilt 將會生成 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,通過這種方式將modules 注入到我們的應用中。可以看到具體的注入方法就是Hilt_MyApplication onCreate() 函數中的((MyApplication_GeneratedInjector) generatedComponent()).injectMyApplication(UnsafeCasts.unsafeCast(this));這句代碼,generatedComponent() 返回的是 MyApplication_HiltComponents.SingletonC 對象,這個對象中就是我們所有module 的代碼實現。有興趣的同學可以自己去看一下,我這里就不貼代碼了

使用

使用分為兩種情況,添加和沒有添加 Hilt Gradle插件

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

建議添加插件,使用起來會更簡單。本文以下的示例都假定以使用插件。這里需要注意的是如果要在MyApplication 中使用注入的對象,需要在 super.onCreate() 之后才能使用。 原因且看介紹中的 Hilt_MyApplication 源碼。這里解釋一下問題1出現的原因,是因為我沒有添加插件但@HiltAndroidApp 使用的時候用的卻是添加了插件的用法。所以會出現module 注入不被實現的情況。

@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 里的是同一個,沒什么好說的。@InstallIn 通過使用@InstallIn(xxxComponent.class) 將module 安裝到指定的組件中,在Hilt 中所以module 都必須添加這個注釋,如果組件中就找不到這個module ,可能引起編譯錯誤。當然一個module 也可安裝到多個組件上如:@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) {...}}

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

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

此外,每個組件都有默認情況下可用的綁定。例如,該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 中的方法以創建提供者方法綁定。該方法的返回類型綁定到其返回值。@Binds 注釋Module 中的抽象方法,一般方法的返回是一個接口,參數是實現接口的子類,在調用是會調用參數的子類中的方法實現。

使用

@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 在創建的時候就會走Hilt 創建的HiltViewModelFactory 進行創建。就可以使用在創建的時候使用Module 中提供的實例

使用

@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介紹

為不能使用注解的地方提供注入的對象。因為@AndroidEntryPoint 使用范圍有限,在這范圍之外要使用Hilt 注入的實例就可以使用@EntryPoint 來實現。這個像是Hilt 把Component標準化后,使用者不能再里面添加方法,導致不能為使用不了注解的地方提供依賴而做出的解決方案。

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

如果使用上面的定義

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

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

以上就是Android Hilt的使用以及遇到的問題的詳細內容,更多關于Android Hilt的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 高压微雾加湿器_工业加湿器_温室喷雾-昌润空气净化设备 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 开云(中国)Kaiyun·官方网站 - 登录入口 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 手板_手板模型制作_cnc手板加工厂-东莞天泓 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 |