安卓app kotlin语法,Hilt是什么东西?

在安卓开发中,Hilt 是 Google 推出的一个**依赖注入(Dependency Injection,简称 DI)**库。

简单来说,Hilt 的作用是自动化地管理类与类之间的依赖关系,让你的代码更整洁、更易于测试和维护。


1. 什么是依赖注入(DI)?

在理解 Hilt 之前,先看一个通俗的例子。

不用 DI 的做法(手动创建):

如果你要在 MainActivity 里用一个 UserService,你可能得自己 new 出来:

code Kotlin

downloadcontent_copy

expand_less

复制代码
class MainActivity : AppCompatActivity() {
    private val userService = UserService(Database()) // 还要手动创建数据库依赖
}

缺点: 如果 UserService 的构造函数变了,或者它依赖了更多东西,你得在每个使用它的地方都改一遍代码。

使用 DI(Hilt)的做法:

你只需要声明"我想要这个东西",Hilt 会自动帮你把它"送过来":

code Kotlin

downloadcontent_copy

expand_less

复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var userService: UserService // Hilt 自动帮你实例化并注入
}

2. Hilt 的核心特点

Hilt 是在著名的 Dagger 基础上开发的,但它比 Dagger 简单得多:

  1. 专门为 Android 设计:内置了 Android 生命周期组件(Activity, Fragment, ViewModel 等)的支持。

  2. 标准化:规定了依赖项应该放在哪里,减少了架构混乱。

  3. 减少模板代码:自动生成那些复杂的 Dagger 样板代码。


3. Hilt 的常用注解(关键语法)

要用好 Hilt,你只需要记住几个核心注解:

  • @HiltAndroidApp :

    必须放在你的 Application 类上。它是 Hilt 的"开关"。

    code Kotlin

    downloadcontent_copy
    expand_less

    复制代码
    @HiltAndroidApp
    class MyApplication : Application()
  • @AndroidEntryPoint :

    放在 Activity、Fragment、View、Service 或 BroadcastReceiver 上。表示这个类可以接受 Hilt 注入的依赖。

    code Kotlin

    downloadcontent_copy
    expand_less

    复制代码
    @AndroidEntryPoint
    class MainActivity : AppCompatActivity() { ... }
  • @Inject:

    • 用在构造函数上:告诉 Hilt 怎么创建这个类的实例。

    • 用在变量上:告诉 Hilt 把实例注入到这个变量里。

    code Kotlin

    downloadcontent_copy
    expand_less

    复制代码
    // 告诉 Hilt 怎么创建这个类
    class MyRepository @Inject constructor() { ... }
    
    // 在 Activity 中使用
    @Inject lateinit var repository: MyRepository
  • @Module 和 @InstallIn :

    如果你要注入的东西是接口 或者第三方库里的类(你没法在人家的构造函数上加 @Inject),就需要用到模块。

    code Kotlin

    downloadcontent_copy
    expand_less

    复制代码
    @Module
    @InstallIn(SingletonComponent::class) // 这个依赖存活范围和 App 一样长
    object NetworkModule {
        @Provides
        fun provideRetrofit(): Retrofit {
            return Retrofit.Builder().baseUrl("https://api.com").build()
        }
    }

4. Hilt 的生命周期(Scope)

Hilt 最厉害的地方在于它能自动绑定 Android 的生命周期:

|-------------------------|----------------------------------|
| 注解 | 存活范围 |
| @Singleton | 整个 App 运行期间(全局单例) |
| @ActivityRetainedScoped | 整个 ViewModel 的生命周期(配置更改如旋转屏幕不销毁) |
| @ActivityScoped | 对应 Activity 的生命周期 |
| @FragmentScoped | 对应 Fragment 的生命周期 |


5. 为什么要学 Hilt?

  1. Google 强推:它是 Jetpack 家族的一部分,是目前 Android 开发的主流标准。

  2. 解耦:你的类不再需要知道它的依赖项是如何创建的。

  3. 单元测试:你可以非常轻松地把真实的数据库依赖替换成"模拟(Mock)"的对象,从而进行测试。

  4. ViewModel 支持:Hilt 对 ViewModel 的注入非常友好,只需一个 @HiltViewModel 注解。

总结

Hilt 是 Android 开发者的"后勤部"。你只需要在代码里打上标签(注解),告诉它你需要什么,它就会在合适的时机(Activity 创建时)把你需要的对象准备好并递给你。

相关推荐
骑着蜗牛撵大象32715 小时前
让 Codex 值夜班:把告警排查与巡检接成可回滚的自动化链路
android·java·运维·ai·自动化·codex·智能体
2401_8858850415 小时前
芬兰语音通知接口怎样对接?语音提醒接入流程
android·前端·python·php·语音识别
大风起兮云飞扬丶16 小时前
Java——枚举
java·开发语言
小灰灰搞电子16 小时前
Rust+Slint 实现高级动态消息提示框源码分享
开发语言·rust
Dev _16 小时前
Python解释器安装在系统级目录导致命令行用户‌没有权限‌向该目录写入文件
开发语言·python
程序猿老A16 小时前
轻量应用服务器怎么用phpcms搭建网站?
android
qq_4069810316 小时前
大白话rust系列08 当变量遮蔽遇上引用,探究变量遮蔽的本质
开发语言·后端·rust
喵了几个咪16 小时前
GoWind ShortPlay 拆解:不用模型的推荐闭环——埋点回流、三路召回与已看去重
开发语言·后端·微服务·golang·gowind
谙弆悕博士16 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
Canmag 兴隆磁性17 小时前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率