2024年已经过半了,我作为聋人独立开发者,我经常会时不时反思:自己这半年到底进步了多少?在这篇文章里,我分享一个用 Jetpack Compose、Material3和 Kotlin 语言实现HiltAppDemo的案例。无论你有没有开发经验,相信这篇文章对你会非常有所帮助。
思考:为什么选择要讲Hilt和概念?
1.前几天外企面试了我问我有没有用过Hilt上手实践以及Hilt基础考点,所以我写一篇技术文章,仅供参考)
Hilt 是一个依赖注入库,它帮你解决组件之间的依赖问题,特别是在需要依赖多个服务或资源时非常好用。二者结合起来,可以让代码变得很简洁、清晰。
一、项目背景
Hilt 是 Android 官方推荐的依赖注入框架,简化了组件之间的依赖管理,特别是当项目复杂度增加时,依赖注入可以简化了代码。
本Demo是展示如何结合 Jetpack Compose 和 Hilt,实现一个简单的双屏Demo,使用 Hilt 管理依赖在 UI 中展示数据。
二、项目开发
从项目结构开始,一步一步实现依赖注入、ViewModel、 Jetpack Compose UI。
2.1 build.gradle文件引入所需的依赖项
代码语言:groovy复制plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
android {
namespace = "com.spd.jetpackcomposedemo1"
compileSdk = 34
defaultConfig {
applicationId = "com.spd.jetpackcomposedemo1"
minSdk = 31
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = 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"
}
buildFeatures {
compose = true
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
implementation(libs.dagger.hilt.android)
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
}
2.2 创建依赖注入写法
Hilt 的使用非常简单,需要在 AndroidManifest.xml
文件中声明一个继承了 Hilt
的 Application 类:
<application
android:name=".MyApplication"
... >
</application>
自动创建对应的类即可,
然后,在 MyApplication
类中加上 @HiltAndroidApp
注解:
@HiltAndroidApp
class MyApplication : Application()
2.3 定义 Repository 和 Hilt Module
现在我们创建一个 Repository
,它是我们依赖注入的对象,负责提供模拟数据。接下来,还需要一个 Hilt 的 Module
告诉 Hilt 如何提供这个依赖。
interface Repository {
fun getData(): String
}
class RepositoryImpl @Inject constructor() : Repository {
override fun getData(): String {
return "Hey from NimRepository"
}
}
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideRepository(): Repository {
return RepositoryImpl()
}
}
2.4 在 ViewModel 使用 Hilt 注入
在 ViewModel
中注入 Repository
依赖。
@HiltViewModel
class MyViewModel @Inject constructor(
private val repository: Repository
) : ViewModel() {
fun fetchData(): String {
return repository.getData()
}
}
2.5 使用 Jetpack Compose 编写 UI
展示从 ViewModel
获取的数据
@Composable
fun MyApp() {
val viewModel: MyViewModel = hiltViewModel()
val data = viewModel.fetchData()
MainScreen(data)
}
@Composable
fun MainScreen(data: String) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = data, style = MaterialTheme.typography.h4)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { }) {
Text("点击Nimyears")
}
}
}
2.6 MainActivity 设置
代码语言:java复制@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApp()
}
}
}
三、技术难点
在实际Demo中,Jetpack Compose 和 Hilt 的结合很简单,但有几个技术难点需要注意:
3.1 生命周期管理
虽然Hilt可以处理依赖注入的生命周期,但在Compose中,组件的生命周期可能会因为UI的重构而变得复杂。使用ViewModel来管理状态是个好办法,可以防止数据意外丢失。
3.2 Compose中的ViewModel注入
通过hiltViewModel()
获取ViewModel是一个便捷的做法,但要确保它被用在合适的Compose函数中,例如在App的入口点MyApp()
函数里。
3.3 参数传递与状态管理
如果依赖注入的数据需要频繁更新,就需要合理管理这些状态,保证UI可以响应状态的变化进行更新。
四、学习笔记
学到了如何有效结合 Jetpack Compose 和 Hilt。学习心得分享给大家:
4.1 Hilt 简化了依赖注入
Hilt 在注入依赖上非常简洁,特别是和 Dagger 相比,它不需要手动配置很多东西。只需要简单的 @Inject
和 @Module
,就能轻松搞定依赖注入。
4.2 Compose 中的状态管理和生命周期理解
理解状态的保存、恢复和更新对于构建复杂App非常重要。
4.3 模块化开发思路
Hilt 和 Compose的结合让代码有模块化 ,每个部分的职责清晰,有利于未来的扩展和维护,对于大型App来说非常重要。
五、总结
通过这个简单的 Jetpack Compose 和 Hilt 的项目,我希望大家能对两者的结合有一个清晰的很好理解。无论是 UI 的声明式编程,还是 Hilt 的依赖注入,它们都能帮助我们写出更加简洁、高效、易维护的代码。
对于Android 开发者说,掌握这些工具都会对未来的项目开发带来巨大的帮助。如果你还没有尝试过使用 Hilt 和 Jetpack Compose,推荐亲自上手试试,看看它们能为Demo带来怎样的提升!
有任何问题欢迎提问,感谢大家阅读 )