安卓软件开发:使用 Hilt 在 Jetpack Compose 和 M3 实现依赖注入App

2024-09-29 15:47:40 浏览数 (1)

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 类:

代码语言:java复制
<application
    android:name=".MyApplication"
    ... >
</application>

自动创建对应的类即可,

然后,在 MyApplication 类中加上 @HiltAndroidApp 注解:

代码语言:java复制
@HiltAndroidApp
class MyApplication : Application()

2.3 定义 Repository 和 Hilt Module

现在我们创建一个 Repository,它是我们依赖注入的对象,负责提供模拟数据。接下来,还需要一个 Hilt 的 Module 告诉 Hilt 如何提供这个依赖。

代码语言:java复制
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 依赖。

代码语言:java复制
@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: Repository
) : ViewModel() {

    fun fetchData(): String {
        return repository.getData()
    }
}

2.5 使用 Jetpack Compose 编写 UI

展示从 ViewModel 获取的数据

代码语言:java复制
@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带来怎样的提升!

有任何问题欢迎提问,感谢大家阅读 )

0 人点赞