一 android hilt 入门教程实战
hilt 是 android 官方推荐的 依赖注入框架,它基于 dagger,简化了依赖管理,适用于 mvvm 架构,提高了代码的可维护性。
1️⃣ 为什么要用 hilt?
在 android 开发中,们通常需要手动创建和管理对象,例如 viewmodel、repository、retrofit 等。hilt 可以自动管理这些对象的创建和生命周期,让们专注于业务逻辑,而不是手动实例化对象。
✅ hilt 的优点:
✔️ 自动管理依赖,避免手动创建实例
✔️ viewmodel 支持,与 jetpack 组件无缝集成
✔️ 作用域管理,不同组件(activity、fragment)能获得合适的对象
✔️ 简化 dagger 依赖注入,代码更简洁
2️⃣ hilt 的基本使用
📌(1)添加 hilt 依赖
与第一点相同
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
id("com.google.dagger.hilt.android")
}
android {
namespace 'com.test.hiltstudy'
compilesdk 35
defaultconfig {
applicationid "com.test.hiltstudy"
minsdk 24
targetsdk 35
versioncode 1
versionname "1.0"
testinstrumentationrunner "androidx.test.runner.androidjunitrunner"
}
buildtypes {
release {
minifyenabled false
proguardfiles getdefaultproguardfile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileoptions {
sourcecompatibility javaversion.version_1_8
targetcompatibility javaversion.version_1_8
}
kotlinoptions {
jvmtarget = '1.8'
}
}
//// allow references to generated code
//kapt {
// correcterrortypes true
//}
dependencies {
implementation libs.androidx.core.ktx
implementation libs.androidx.appcompat
implementation libs.material
implementation libs.androidx.activity
implementation libs.androidx.constraintlayout
testimplementation libs.junit
androidtestimplementation libs.androidx.junit
androidtestimplementation libs.androidx.espresso.core
// hilt dependencies
implementation("com.google.dagger:hilt-android:2.51.1")
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
// fragment ktx for viewmodels() delegate
implementation("androidx.fragment:fragment-ktx:1.6.2")
// viewmodel
// implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
// implementation("androidx.activity:activity-ktx:1.8.1")
//retrofit
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}📌(2)初始化 hilt
在 androidmanifest.xml:
<application
android:name=".myapplication"
...>
</application>然后创建 myapplication.kt:
@hiltandroidapp class myapplication : application()
🔹 @hiltandroidapp 用于初始化 hilt,它会在 app 启动时配置依赖注入。
📌(3)在 activity/fragment 使用 hilt
在 activity 里启用 hilt
@androidentrypoint
class mainactivity : appcompatactivity() {
@inject
lateinit var someclass: someclass // 自动注入
}🔹 @androidentrypoint 标记 activity 以支持 hilt
🔹 @inject lateinit var someclass: someclass 直接注入对象
在 fragment 里启用 hilt
@androidentrypoint
class mainfragment : fragment() {
@inject
lateinit var somerepository: somerepository
}💡 activity 和 fragment 都必须加 @androidentrypoint 才能使用 hilt 注入的对象!
📌(4)在 viewmodel 里使用 hilt
@hiltviewmodel
class mainviewmodel @inject constructor(
private val repository: somerepository
) : viewmodel() {
fun fetchdata() = repository.getdata()
}在 activity 或 fragment 里:
private val viewmodel: mainviewmodel by viewmodels()
🔹 hilt 自动创建 mainviewmodel,不用 viewmodelprovider 手动实例化。
📌(5)创建 hilt 模块(module)
如果 somerepository 不能用 @inject 直接构造,比如 retrofit,们需要 使用 module 提供实例:
@module
@installin(singletoncomponent::class) // 作用于整个应用生命周期
object appmodule {
@provides
@singleton
fun provideretrofit(): retrofit {
return retrofit.builder()
.baseurl("https://api.example.com/")
.addconverterfactory(gsonconverterfactory.create())
.build()
}
@provides
@singleton
fun provideapiservice(retrofit: retrofit): apiservice {
return retrofit.create(apiservice::class.java)
}
}🔹 @module 标记为 hilt 模块
🔹 @provides 提供依赖
🔹 @singleton 表示单例
3️⃣ hilt 作用域
| 作用域 | 说明 | 示例 |
|---|---|---|
@singleton | 全局单例,应用级共享 | retrofit、数据库 |
@activityscoped | 只在 activity 里共享 | 共享 viewmodel |
@viewmodelscoped | 只在 viewmodel 里共享 | repository |
4️⃣ hilt 实战示例
1️⃣ 创建一个 repository
class somerepository @inject constructor() {
fun getdata(): string = "hello from repository"
}2️⃣ 在 viewmodel 里注入
@hiltviewmodel
class mainviewmodel @inject constructor(
private val repository: somerepository
) : viewmodel() {
fun fetchdata(): string = repository.getdata()
}3️⃣ 在 activity 里获取数据
@androidentrypoint
class mainactivity : appcompatactivity() {
private val viewmodel: mainviewmodel by viewmodels()
override fun oncreate(savedinstancestate: bundle?) {
super.oncreate(savedinstancestate)
setcontentview(r.layout.activity_main)
findviewbyid<textview>(r.id.textview).text = viewmodel.fetchdata()
}
}✅ 运行后,textview 显示 "hello from repository" 🎉
5️⃣ 总结
🔹 @hiltandroidapp 让应用支持 hilt
🔹 @androidentrypoint 用于 activity/fragment
🔹 @hiltviewmodel 用于 viewmodel
🔹 @inject 直接注入类实例
🔹 @module + @provides 提供无法直接注入的对象(如 retrofit)
🔹 @singleton、@activityscoped 控制对象生命周期
hilt 让 依赖注入变得简单高效,可以自动管理对象,提升代码的可维护性。
参考
到此这篇关于android hilt 入门教程_实战的文章就介绍到这了,更多相关android hilt 入门内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论