Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > kotlin使用dagger

在kotlin的安卓项目中使用dagger的操作方法

作者:Mac Zhu

在 Kotlin 的 Android 项目中使用 ​​Dagger​​(特别是 ​​Dagger Hilt​​,官方推荐的简化版)进行依赖注入(DI)可以大幅提升代码的可测试性和模块化程度,这篇文章主要介绍了在kotlin的安卓项目中使用dagger的相关操作,需要的朋友可以参考下

在 Kotlin 的 Android 项目中使用 ​​Dagger​​(特别是 ​​Dagger Hilt​​,官方推荐的简化版)进行依赖注入(DI)可以大幅提升代码的可测试性和模块化程度。

1. 配置 Dagger Hilt​​

​​1.1 添加依赖​​

在 build.gradle (Module) 中:

plugins {
    id("com.google.dagger.hilt.android") version "2.48" apply false
}
dependencies {
    implementation("com.google.dagger:hilt-android:2.48")
    kapt("com.google.dagger:hilt-compiler:2.48") // Kotlin 注解处理器
}

在 build.gradle (Project) 中:

plugins {
    id("com.google.dagger.hilt.android") version "2.48" apply false
}

​​1.2 启用 Hilt​​

在 Application 类上添加 @HiltAndroidApp

@HiltAndroidApp
class MyApp : Application()

​​2. 核心注解与用法​​ ​​

2.1 注入依赖到 Android 类​​

使用 @Inject 标记需要注入的依赖,并在目标类(如 ActivityFragment)上添加 @AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var myDependency: MyDependency // 依赖注入
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myDependency.doSomething() // 直接使用
    }
}

​​2.2 提供依赖(Module)​​

使用 @Module 和 @Provides 定义依赖:

@Module
@InstallIn(SingletonComponent::class) // 作用域为全局单例
object AppModule {
    @Provides
    fun provideMyDependency(): MyDependency = MyDependencyImpl()
}

​​2.3 作用域(Scoping)

@Module
@InstallIn(ViewModelComponent::class) // 作用域为 ViewModel
object ViewModelModule {
    @ViewModelScoped
    @Provides
    fun provideMyViewModelDependency(): MyViewModelDependency = MyViewModelDependencyImpl()
}

​​3. 注入 ViewModel​​

结合 ViewModel 和 Hilt

@HiltViewModel
class MyViewModel @Inject constructor(
    private val myDependency: MyDependency
) : ViewModel() {
    fun doWork() {
        myDependency.doSomething()
    }
}

在 Activity/Fragment 中获取:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()
}

​​4. 注入接口或第三方库​​ ​

4.1 接口绑定(@Binds)​​

interface MyRepository {
    fun getData(): String
}
class MyRepositoryImpl @Inject constructor() : MyRepository {
    override fun getData() = "Data from Repository"
}
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    abstract fun bindMyRepository(impl: MyRepositoryImpl): MyRepository
}

​​4.2 注入 Retrofit / Room​​

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Provides
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
    @Provides
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }
}

​​5. 常见问题与解决

​​​​5.1 编译错误:Cannot be provided without an @Provides

​​5.2 作用域冲突

​​5.3 延迟注入(Lazy)​​

如果依赖初始化耗时,可以使用 Lazy<T>

@Inject lateinit var heavyDependency: Lazy<HeavyDependency>
fun useDependency() {
    heavyDependency.get().doWork() // 使用时才初始化
}

​​6. Dagger Hilt vs. Dagger 2​​

​特性​​Dagger Hilt​​Dagger 2​
​配置复杂度​低(自动生成组件)高(需手动定义组件)
​作用域管理​内置 Android 生命周期作用域(如 @ActivityScoped需自定义作用域
​适用场景​标准 Android 项目需要高度定制的复杂项目

​​7. 最佳实践

到此这篇关于在kotlin的安卓项目中使用dagger的文章就介绍到这了,更多相关kotlin使用dagger内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文