上手指南 | Jetpack Hilt 依赖注入框架

Android Jetpack 的 Hilt依赖注入框架的使用介绍 Hilt依赖注入框架的使用介绍 引入Hilt 1. 在项目根目录的build.gradle文件中配置Hilt的插件路径: buildscript { ... dependencies { ... classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha' } } 2. 在app/build.gradle文件中,引入Hilt的插件并添加Hilt的依赖库: ... //apply 阅读详情

Jetpck Dagger-Hilt

依赖注入是什么

一个类里面有一个变量,这个变量就是这个类的依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。

Hilt 是什么

​ Hilt 是 Android 的依赖注入库,其实是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。

​ Hilt 创建了一组标准的 组件和作用域。这些组件会自动集成到 Android 程序中的生命周期中。在使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。

Hilt 常用的注解的含义
  • @HiltAndroidApp @HiltAndroidApp 将会触发 Hilt 的代码生成,作为程序依赖项容器的基类 生成的 Hilt 依附于 Application 的生命周期,他是 App 的父组件,提供访问其他组件的依赖 在 Application 中配置好后,就可以使用 Hilt 提供的组件了;组件包含 Application,Activity,Fragment,View,Service 等。
  • @HiltAndroidApp 创建一个依赖容器,该容器遵循 Android 的生命周期类,目前支持的类型是: Activity, Fragment, View, Service, BroadcastReceiver.
  • @Inject 使用 @Inject 来告诉 Hilt 如何提供该类的实例,常用于构造方法,非私有字段,方法中。 Hilt 有关如何提供不同类型的实例信息也称之为绑定
  • @Module module 是用来提供一些无法用 构造@Inject 的依赖,如第三方库,接口,build 模式的构造等。 使用 @Module 注解的类,需要使用 @InstallIn 注解指定 module 的范围 增加了 @Module 注解的类,其实代表的就是一个模块,并通过指定的组件来告诉在那个容器中可以使用绑定安装。
  • @InstallIn 使用 @Module 注入的类,需要使用 @InstallIn 注解指定 module 的范围。 例如使用 @InstallIn(ActivityComponent::class) 注解的 module 会绑定到 activity 的生命周期上。
  • @Provides 常用于被 @Module 注解标记类的内部方法上。并提供依赖项对象。
  • @EntryPoint

Hilt 支持最常见的 Android 类 Application、Activity、Fragment、View、Service、BroadcastReceiver 等等,但是您可能需要在Hilt 不支持的类中执行依赖注入,在这种情况下可以使用 @EntryPoint 注解进行创建,Hilt 会提供相应的依赖。

Hilt 中的组件(Compenent)

使用 @Module 注解的类,需要使用 @Installin 注解来指定 module 的范围。

例如 @InstallIn(ApplicationComponent::class) 注解的 Module 就会绑定到 Application 的生命周期上。

Hilt 提供了以下组件来绑定依赖与对应 Android 类的活动范围

Hilt 组件对应 Android 类活动的范围
ApplicationComponentApplication
ActivityRetainedComponentViewModel
ActivityComponentActivity
FragmentComponentFragment
ViewComponentView
ViewWithFragmentComponentView annotated with @WithFragmentBindings
ServiceComponentService

Hilt 没有为 broadcast receivers 提供组件,因为 Hilt 直接进从 ApplicationComponent 中注入 broadcast receivers。

Hilt 中组件的生命周期

Hilt 会根据相应的 Android 类生命周期自动创建和销毁组件的实例,对应关系如下:

Hilt 提供的组件创建对应的生命周期结束对应的生命周期作用范围
ApplicationComponentApplication#onCreate()Application#onDestroy()@Singleton
ActivityRetainedComponentActivity#onCreate()Activity#onDestroy()@ActivityRetainedScope
ActivityComponentActivity#onCreate()Activity#onDestroy()@ActivityScoped
FragmentComponentFragment#onAttach()Fragment#onDestroy()@FragmentScoped
ViewComponentView#super()View destroyed@ViewScoped
ViewWithFragmentComponentView#super()View destroyed@ViewScoped
ServiceComponentService#onCreate()View destroyed@ViewScoped
如何使用 Hilt
buildscript {
    dependencies {
        //hilt
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
    }
}
复制代码
apply plugin: 'kotlin-kapt'
apply plugin: 'com.xiaojinzi.component.plugin'

//hilt
api "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"

复制代码
@HiltAndroidApp
class BaseApplication : Application() {

    override fun onCreate() {
        super.onCreate()
    }
}
复制代码

到这里准备工作就做完了

使用 Hilt 进行依赖注入
class HiltTest @Inject constructor() {

    fun hiltTest() {
        Log.e("----------->", "hiltTest: ")
    }
}
复制代码
@HiltAndroidApp
class BaseApplication : Application() {

    @Inject
    lateinit var hiltTest: HiltTest

    override fun onCreate() {
        super.onCreate()
        hiltTest.hiltTest()
    }
}
复制代码
Hilt 在 Android 组件中的使用
  • 如果使用 @AndroidEntryPoint 注解 Android 类,还必须注解依赖他的 Android 类;
  • 例如: 给 fragment 使用 @AndroidEntryPoint 后,则还需要给 fragmet 依赖的 Activity 依赖 @AndroidEntryPoint ,否则会出现异常
  • @AndroidEntryPoint 不能以写在抽象类上
  • @AndroidEntryPoint 注解 仅仅支持 ComponentActivity 的子类,例如 Fragment,AppCompatActivity 等等。
@AndroidEntryPoint
class HomeNavigationActivity : BaseLayoutActivity<TestViewModel>() {

    override fun setViewModel(): Class<TestViewModel> =TestViewModel::class.java

    override fun layout(): Int {
        return R.layout.home_navigation
    }

    override fun bindView() {
    }

}
复制代码
// fragment 中使用,需要本身所依赖的 activity 添加注解
@AndroidEntryPoint
class FragmentOne : BaseLayoutFragment<FragOneViewModel>() {
    
    //使用 @Inject 从组件中获取依赖进行注入
    @Inject
    lateinit var hiltTest: HiltTest

    override fun layout(): Int {
        return R.layout.frag_one
    }
    override fun bindView(rootView: View) {
        //对象已经注入,直接调用即可
        one.text = hiltTest.hiltTest()
    }
}
复制代码
Hilt 和第三方组件的使用

如果需要在项目中注入第三方依赖,可以使用 @Module 注解。使用 @Module 在注解的普通类,在其中创建第三方依赖的对象即可。

  • @Module 模块用于向 Hilt 添加绑定,告诉 Hilt 如果提供不同类型的实例。 使用了 @Module 的类,相当于是一个模块,常用于创建依赖对象(如,Okhttp,Retrofit 等)。
  • 使用 @Module 的类,需要使用 #InstallIn 指定此 module 的范围,会绑定到对应 Android 类的生命周期上
  • @Providers,常用于被 @Module 注解标记类的内部方法,并提供依赖项对象。
//对应的生命周期为 application
@Module
@InstallIn(ApplicationComponent::class)
object TestModule {
    
    /**
     * 每次都是新的实例
     */
    @Provides
    fun bindHiltTest(): HiltTest {
        XLog.e("--------bindHiltTest----")
        return HiltTest()
    }

    /**
     * 全局复用同一个实例
     */
    @Provides
    @Singleton
    fun bindSingTest(): Test {
        XLog.e("--------bindSingTest----")
        return Test()
    }

}
复制代码

使用如下:

@Inject
lateinit var hiltTest: HiltTest

@Inject
lateinit var hiltTest1: HiltTest

@Inject
lateinit var test1: Test

@Inject
lateinit var test2: Test
复制代码

其中 bindSingTest 只会被调用一次,@SingLeton 相当于是一个单例

Hilt 和 ViewModel 的使用

使用之前需要在 app.build 下添加一下对 viewModel的支持

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
复制代码
  • 通过 @ViewModelInject 注解进行构造注入。
  • SavedStateHandle 使用 @Asssisted 注解
class HomeContentViewModel @ViewModelInject  constructor(
    private val response: HomeContentRepository,
    @Assisted val  state: SavedStateHandle
) : ViewModel() {
    
    private val liveData by lazy { MutableLiveData<String>() }

    val testLiveData: LiveData<String> by lazy { liveData }
    
    fun requestBaiDu() {
        launchVmHttp {
            liveData.postValue(response.requestBaidu())
        }
    }
}
复制代码
  • 通过 @Inject 进行注入,在 viewModel 中不需要手动的创建其对象
@ActivityScoped
class HomeContentRepository @Inject constructor() : BaseRepository() {

    suspend fun requestBaidu(): String {
        return LvHttp.createApi(ApiServices::class.java).baidu()
    }
}
复制代码
  • 获取 viewModel 的实例
@AndroidEntryPoint
class HomeContentActivity : AppCompatActivity(){

    //生成 ViewModel 的实例
    private val viewModel by viewModels<HomeContentViewModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home_content)


        viewModel.requestBaiDu()
        viewModel.testLiveData.observe(this, Observer {
            ToastUtils.show(it)
        })
}
复制代码
Hilt 和 Room 的使用

这里需要用到 @Module 注解,使用 @Module 注解的普通类,在其中提供 Room 的实例。并且使用 @InstallIn 来声明 作用范围。

@Module
@InstallIn(ApplicationComponent::class)
object RoomModel {

    /**
     * @Provides:常用于被 @Module 标记类的内部方法,并提供依赖对象
     * @Singleton:提供单例
     */
    @Provides
    @Singleton
    fun provideAppDataBase(application: Application): AppDataBase {
        return Room
            .databaseBuilder(application, AppDataBase::class.java, "knif.db")
            .fallbackToDestructiveMigration()
            .allowMainThreadQueries()
            .build()
    }

    @Provides
    @Singleton
    fun providerUserDao(appDataBase: AppDataBase): UserDao {
        return appDataBase.getUserDao()
    }
}
复制代码

我们给 providerUserDao 使用了 @Provides 注解 和 @Singleton 注解,是为了告诉 Hilt,当使用 UserDao 时需要执行 appDataBase.getUserDao() 。

而在调用 appDataBase.getUserDao() 时需要传入 AppDataBase,这时就会调用上面的方法 provideAppDataBase 了,因为这个方法也是用了 @Provides 注解。

并且这两个方法都是单例,只会调用一次。

使用如下:

class FragmentTwo : BaseLayoutFragment<FragTwoViewModel>() {

    @Inject
    lateinit var userDao: UserDao
}
复制代码

到现在为止,就可以在任意地方获取到 UserDao,并且不用手动的创建实例。

使用 @Binds 进行接口注入

Binds:必须注释一个抽象函数,抽象函数的返回值是实现的接口。通过添加具有接口实现类型的唯一参数来指定实现。

首先需要一个接口,和一个实现类

interface User {
    fun getName(): String
}
复制代码
class UserImpl @Inject constructor() : User {
    override fun getName(): String {
        return "345"
    }
}
复制代码

接着就需要新建一个 Module。用来实现接口的注入

@Module
@InstallIn(ApplicationComponent::class)
abstract class UserModule {
    @Binds
    abstract fun getUser(userImpl: UserImpl): User
}
复制代码

注意:这个 Module 是抽象的。

使用如下:

@AndroidEntryPoint
class FragmentOne : BaseLayoutFragment<FragOneViewModel>() {

    @Inject
    lateinit var user: User
}
复制代码
使用 @Qualifier 提供同一接口,不同的实现

还是上面的 User 接口,有两个不同的实现,如下:

class UserAImpl @Inject constructor() : User {
    override fun getName(): String {
        return "345"
    }
}
复制代码
class UserBImpl @Inject constructor() : User {
    override fun getName(): String {
        return "Lv"
    }
}
复制代码

接着定义两个注解

@Qualifier
annotation class A

@Qualifier
annotation class B
复制代码

然后修改 Module ,在 module 中用来标记相应的依赖。

@Module
@InstallIn(ApplicationComponent::class)
abstract class UserAModule {
    @A
    @Singleton
    @Binds
    abstract fun getUserA(userImpl: UserAImpl): User
}

@Module
@InstallIn(ActivityComponent::class)
abstract class UserBModule {
    @B
    @ActivityScoped
    @Binds
    abstract fun getUserB(userImpl: UserBImpl): User
}
复制代码

这里用了两个不同的 mdule,并且对应两个不同的 component,一个是 application,另一个是 activity

最后使用如下:

@AndroidEntryPoint
class FragmentOne : BaseLayoutFragment<FragOneViewModel>() {

    @A
    @Inject
    lateinit var userA: User

    @B
    @Inject
    lateinit var userB: User
}
复制代码
遇到的问题

在使用 @AndroidEntryPoint 注解的时候。需要在 fragment 和 actvity 都使用这个注解。

但是如果 activity 和 fragment 没在同一个module中,就会报错。

对于组件化的项目来说,这种情况就比较难受了。。。。

查找了一些资料:

  • 主要问题之一是,通过在 Hilt 中发现模块的方式,无法区分哪些模块属于应用中的组件(如果他们确实使用过 Hilt) 已经库或其他库中的组件
  • 另一个问题是,他将预先构建的组件层次结构变得复杂和混乱。就将你的库中所有活动一样,使父级成为 ApplicationComponent 也没有意义,因为您没有将组件放入 Application 。同样,如果一个仅包含片段库并托管在应用程序的活动中,那可能会遇到类似的情况,您希望库片段是独立的,单让 FragmentComponent 对象作为 ActivityComponent 并没有意义。
Hilt 好处
  • 降低 Android 开发者使用依赖注入框架的上手成本
  • 内部有一套标准的组件和作用域,对范围进行声明后,只能使用在指定的作用域中使用这个类,并且提供声明周期的管理,会自动释放不在使用的对象,减少资源的过度使用,提供代码的可重用性。
  • 使用起来简单,告别繁琐的 new。。。 这种流程,只需要添加注解即可。提高了代码的可读性,构建简单,耦合变低,容易测试
  • 我感觉最大的好处就是管理他们的生命周期,只能在对应的范围内进行使用。感觉非常好。

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2024最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

MyScore:该项目展示了如何将Hilt Dependency Injection与Room DB,协程以及MVVM一起使用 我的分数 这是一个基于清晰架构的演示应用程序,可提高我在Koltin方面的技能 使用的技术: 击中 MVVM 改造2 房间 立即下载

相关推荐

实测iOS和安卓大不同!用NFC触发小程序跳转的完整避坑指南(含NFC Tools配置)

本文深入解析iOS与安卓在NFC触发小程序跳转时的核心差异,提供微信与支付宝小程序的NFC实现方案及优化技巧。涵盖跨平台兼容性测试方法论、性能优化策略及异常处理方案,帮助开发者避开常见陷阱,提升跳转成功率。特别针对NFC Tools配置和微信Universal Link使用进行详细指导。

asdfghjkl978564的博客 434

一看就会 Android中Hilt的各场景使用

关于Hilt与Koin的性能对比,之前有过分析。Hilt可以在Java/Kotin的语言环境中使用,内存使用、启动时间、体积大小等都小有优势,但是使用比较复杂,这里把常用的几种类型分别讲解。哪一种情况下使用哪一种方式定义和注入。最后关于Hilt的前世今生和详细Api说明,郭神的文章早有详细说明。我就直接上场景和代码了。郭神与网上绝大部分都是基于2.28-alpha版本。我这里使用的是新版2.38.1版本。使用的流程和部分Api注解与老版本有所区别。1、依赖版本依赖版本,这里注意和老版本不同,无需再集成Vie

chuyouyinghe的专栏 2616

Android PackageManagerService 总结(一)应用市场下载安装apk流程

前言: 本篇文章是对系统包安装流程的总结,基于Android12 上 com.android.packageinstaller 源码的分析,第三方应用商城(华为商城,小米商城,应用宝,豌豆荚,酷安等)下载安装应 用,在普通安装和静默安装app两种方式下,对代码流程的梳理和讲解。 触发安装: 当你在商城界面中点击安装按钮,应用会自动下载,下载完成后就会调起系统安装应用的界面,此种触发方式一般是通过Intent 隐式调用的,我们先阅读如下代码: ......

u012514113的专栏 1万+

kotlin--综合运用Hilt、Paging3、Flow、Room、Retrofit、Coil等实现MVVM架构实战

前面我们使用Java来运用JetPack中的一系列组件,又使用kotlin运用这些组件实现了一系列功能: kotlin--Flow文件下载 kotlin--Flow结合Room运用 kotlin--Flow结合retrofit运用 kotlin--StateFlow运用 kotlin--SharedFlow运用 接着,Jetpack的Paging3中,我们使用的语言是kotlin,相信通过这些...

aruba的博客 2160

VConsole动态加载

// 移动端真机调试工具 vconsole import VConsole from "vconsole"; import Vue from "vue"; // 动态使用VConsole if(process.env.NODE_ENV==='production'){ if(process.env.VUE_APP_BASEURL.includes('test')||process.env.VUE_APP_BASEURL.includes('pre')){ Vue.prototype

aliven1的博客 1043

电磁兼容(EMC)整改案例(七):EFT测试失败都是IC悬空引脚惹的祸

无论任何时候,为了避免这些问题,通常建议对悬空的IO口进行适当的配置,比如设置为强推挽输出低电平、输入带上拉或下拉电阻等,以减少外部电路对IO管脚状态的影响,并提高系统的稳定性和可靠性.

linkking27的博客 1032

Hilt-依赖注入框架上手指南

Hilt 是Google 最新的依赖注入框架,其是基于Dagger。对于Android开发者来说,Hilt可以说专门为Android 打造,提供了一种将Dagger依赖项注入到Android应用程序的标准方法,而且创建了一组标准的组件和作用域,这些组件会自动集成到Android应用程序的各个生命周期中,以简化开发者的上手难度。 在学习本文之前,假定大家已经了解依赖注入是什么,如果没有了解过,可以先了解概念。Hilt 的目的是降低Android 开发者使用依赖注入框架的上手成本,但是基本的理念大家还是要明.

petterp的博客 1万+

YOLO11涨点优化:卷积魔改 | DCNv2升级版本,助力检测

在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版本——DCNv2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 967

Android使用Hilt依赖注入,让人看不懂你代码

以手机为例,要组装一台手机,我们需要哪些部件呢?从宏观上分类:软件+硬件。由此我们可以说:手机依赖了软件和硬件。//打电话//软件//硬件FishPhone 依赖了两个对象:分别是Software和Hardware。Software和Hardware是FishPhone的依赖(项)。

4055

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1468

解决Office 365 SMTP问题:C#邮件发送详解

本文介绍了如何在C#中使用Office 365 SMTP服务发送邮件。重点讲解了正确配置SMTP客户端的关键参数:必须使用587端口并启用TLS加密(EnableSsl=true),同时通过NetworkCredential进行身份验证。虽然SmtpClient已不推荐用于新项目,但本文提供的代码示例仍适用于临时项目或系统维护,并建议未来可考虑使用MailKit等现代邮件库。文章还包含了错误处理机制,确保程序健壮性。

2501_90323865的博客 141

Jetpack Hilt 依赖注入框架上手指南

前言 依赖注入是什么 个人理解:吧有依赖关系的类放在容器中,解析这些类的实例,并在运行时注入到对应的字段中,就是依赖注入,目的是为了类的解耦 例子:A 类 中用到了 B 类,一般情况下需要在 A 类中 new B() 的实例对象 采用依赖注入后,在 A 类中 定义一个私有的 B 类 字段。并在运行的时候通过从相关的容器中获取出来 B 的对象并注入到 A 类中的 字段中。 这样做的好处是什么? 如果有很多个类需要使用 B 类。难道都要在各自的类中进行 new B() 吗。这样对后期的维护和管理都是不方便的。使

Android_008的博客 636

游戏玩家和排行数据抓取:使用 Python 爬虫抓取游戏中的玩家排名、角色数据和战绩

对于游戏开发者、分析师和玩家本身来说,抓取游戏中的玩家排名、角色数据和战绩信息是一项至关重要的任务。Python提供了强大的爬虫库和数据处理工具,可以帮助我们高效地抓取和分析游戏数据,为游戏分析师、开发者以及玩家本身提供有价值的数据支持。通过本篇博客,我们学习了如何使用Python爬虫技术抓取游戏中的玩家排名、角色数据和战绩。本篇博客将详细介绍如何使用Python编写爬虫来抓取游戏中的玩家排名、角色数据和战绩,并结合最新的技术来实现高效的数据抓取与处理。为了方便后续的数据处理,我们将抓取的数据保存到。

2201_76125261的博客 945

android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群作者:LvKang-insist链接:https://juejin.im/post/5efdff9d6fb9a07eb7357ac9声明:本文已获LvKang-insist授权发表,转发等请联系原作者授权依赖注入是什么个人理解:把有依赖关系的类放在容器中,解析这些类的实例,并在运行时注入到对应的字段中,就是依...

weixin_39990819的博客 238

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

依赖注入的英文名是Dependency Injection,简称DI。事实上这并不是什么新兴的名词,而是软件工程学当中比较古老的概念了。 如果要说对于依赖注入最知名的应用,大概就是Java中的Spring框架了。Spring在刚开始其实就是一个用于处理依赖注入的框架,后来才慢慢变成了一个功能更加广泛的综合型框架。 我在学生时代学习Spring时产生了和绝大多数开发者一样的疑惑,就是为什么我们要使用依赖注入呢? 现在的我或许可以给出更好的答案了,一言以蔽之:解耦。 耦合度过高可能会是你的项目中一个比较

郭霖的专栏 3万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android Jetpack组件之Hilt使用

本篇文章的主题是Hilt。 Hilt是一个功能强大且用法简单的依赖注入框架,同时也可以说是今年Jetpack家族中最重要的一名新成员。 那么为什么说这是一篇我自己都比较怕的文章呢?因为关于依赖注入的文章太难写了。我觉得如果只是向大家讲解Hilt的用法倒还算是简单,但是如果想要让大家弄明白为什么要使用Hilt?或者再进一步,为什么要使用依赖注入?这就不是一个非常好写的话题了。 本篇文章我会尝试将以上几个问题全部讲清楚,希望我可以做得到。 为什么要使用依赖注入? 依赖注入的英文名是Dependency

Jason_Lee155的博客 5752

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Android Jetpack】Hilt 依赖注入框架

Hilt支持最常见的Android类Application、Activity、Fragment、View、Service、BroadcastReceiver等等,但是您可能需要在Hilt不支持的类中执行依赖注入,在这种情况下可以使用@EntryPoint注解进行创建,Hilt会提供相应的依赖。常用于创建依赖类的对象(例如第三方库 OkHttp、Retrofit等等),使用@Module注解的类,需要使用@InstallIn注解指定module的范围。Hilt需要知道如何从相应的组件中提供必要依赖的实例。

xoliu的博客 1686

在Android Jetpack Compose中使用Hilt依赖注入

假设我们有一个仅在特定Activity中使用的对象,可以为其定义Activity作用域。// 业务逻辑@Inject) {// 使用someDependencyHilt中的依赖组件具有固定的生命周期,无法更改,因此我们可以创建一个新的组件。由于它不是预定义的组件,Hilt不会知道在何处创建它或保留多长时间,所以这些部分必须由我们自己实现。自定义组件需要两样东西:一个父组件(在本例中是ActivityComponent)和一个用于构建它的Builder接口。

虎哥LoveDroid 2716
上一篇: 2024不可缺的Android学习路线图
下一篇: 鸿蒙(HarmonyOS)再启航,又有银行“官宣”加入鸿蒙生态
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1477原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值