Kotlin开发Android App和Java的差异6----Kotlin中使用Hilt依赖注入

本文探讨了依赖注入的概念,手动依赖注入的不足,并介绍了Hilt这一Google推荐的Android依赖注入库。通过示例展示了如何配置Hilt,使用注解如@Inject、@AndroidEntryPoint和@Binds进行依赖管理,以及如何处理接口注入问题。Hilt旨在减少模板代码,提高代码的可维护性和测试性。
摘要由CSDN通过智能技术生成

个人淘宝店铺需要的小伙伴可以点进来

1 依赖注入

什么是依赖注入,就是在一个类中,经常依赖另一个类,需要使用这个类的方法或者字段,那么想要使用这个类,就需要创建这个类的实例,如果依赖的类多,那么就需要创建很多实例,这是非常消耗资源的方式,那么如果你非常熟悉设计模式,那么可以使用手动依赖注入的方式,或者参数注入的方式

interface Engine{
    fun doWork()
}

class Factory(private val engine: Engine){

    fun doSomething(){

        engine.doWork()
    }

}

class AEngine : Engine{

    override fun doWork() {
        println("这是A引擎")
    }
}

class BEngine : Engine{

    override fun doWork() {
        println("这是B引擎")
    }
}

如果想要生产A引擎,那么就传入A引擎的实例,如果想要生产B引擎,那么就可以传入B引擎的实例,这就是简单的手动依赖注入,那么这种方式存在什么不足吗?

var factory = Factory(AEngine())
factory.doSomething()

在一个项目中,可能不止一个地方在用这个工厂方法,那么就需要在任何使用的地方写这些模板代码,而且在使用Factory之前,必须要把所有的依赖项的实例创建出来。

2 Hilt依赖注入

对于Hilt的依赖注入,主要是在JectPack组件中使用。在此之前,Dagger是依赖注入的常客,但是其使用难度比较大,因此Google在Dagger的基础上,推出了Hilt组件,用于解决大量模板代码的构建。

2.1 依赖配置

app   build.gradle
 //依赖注入
 implementation "com.google.dagger:hilt-android:2.28-alpha"
 kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
 
plugins

id 'dagger.hilt.android.plugin'
id 'kotlin-kapt'

项目 build.gradle

classpath "com.google.dagger:hilt-android-gradle-plugin:2.28-alpha"

2.2 常用的注解

@Inject:可以在类的构造函数中注释,告诉Hilt要创建这个类的实例
@AndroidEntryPoint:可以注释Activity、Fragment、View等,需要注意的就是,在Fragment中注释时,包裹其的Activity容器也需要标注@AndroidEntryPoint

@AndroidEntryPoint
class MathFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null
@AndroidEntryPoint
class NewsActivity : AppCompatActivity() {

    private lateinit var mathFragment: MathFragment

@HiltAndroidApp:需要在Application中注释,代表当前应用是一个Hilt项目

@HiltAndroidApp
class MyApplication : Application() {

	override fun onCreate() {
	    super.onCreate()
	
	    Log.e("TAG","Application onCreate")
	    //做数据库的初始化操作
	    DataBaseManager.instance.init(this)
	
	}
}

2.3 @Inject使用方式

class MyViewModel @Inject constructor(private val repository: NewsRepository) : ViewModel() {
    //需要持有Model层的引用

    fun getUser():MutableLiveData<String>{

        return repository.getUser()
    }

}

需要注意的就是,@Inject注解属于链式的引用,在当前类中使用Inject注解修饰,那么其形参也需要使用Inject注解修饰构造函数

class NewsRepository @Inject constructor (private val newsDataSource: NewsDataSource) {

     fun getUser():MutableLiveData<String>{

        return newsDataSource.getUser()
    }
}

2.4 @Moudle模块注解使用

但如果参数是接口,没有构造函数,该如何注入依赖

interface  INewsDataSource {

    fun getUser():MutableLiveData<String>

}

@Module
@InstallIn(ActivityComponent::class)
abstract class NewsDataMoudle{

    @Binds
    abstract fun NewsDataBinding(
        newsDataSource: NewsDataSource
    ):INewsDataSource
}

解决的方式就是在接口类中创建一个抽象类,向外提供这个接口,其中涉及到的注解有@Module、@InstallIn、@Binds,其中InstallIn中的参数表示向哪些类中注入这个注解,示例中ActivityComponent代表这个接口可以在所有的Activity中使用

@Binds中,需要在参数中配置依赖项,就是当前接口的实现类,告知Hilt要实现哪个类,当前实现类也需要使用@Inject修饰构造函数

Kotlin HiltHilt Android Dependency Injection)是Android Jetpack库的一个模块,它提供了一种简化安卓应用依赖注入的方式。Hilt基于Google的Dagger框架,使得我们可以轻松地在Android组件自动绑定并管理依赖项,而无需手动创建和维护`@Inject`注解的实例。 要在Kotlin项目使用Hilt,你需要按照以下步骤操作: 1. **添加依赖**: 将`ktx`和`hilt-android`库添加到你的构建.gradle文件: ```gradle implementation 'androidx.core:ktx:1.4.0' kapt 'com.google.dagger:hilt-android-compiler:2.40.1' ``` 2. **启用Hilt**: 在`AndroidManifest.xml`声明`<application>`标签里的`meta-data`,指定`dagger.hilt.android.application=true`: ```xml <application android:name=".MyApplication" ...> <meta-data android:name="dagger.hilt.android.application" android:value="true" /> ... </application> ``` 3. **标记需要注入的组件**: 使用`@HiltComponent`注解标记你的App或Fragment等组件,表示它们将由Hilt管理其依赖: ```kotlin @HiltComponent(modules = [MyModule::class]) interface MyAppComponent : AndroidInjector<MyActivity> ``` 4. **注入依赖**: 在类上使用`@Inject`注解声明依赖,并在构造函数使用`@Inject`,Hilt会自动处理依赖的创建和传递: ```kotlin class MyClass { lateinit var myService: MyService @Inject constructor(private val serviceFactory: ServiceFactory) { myService = serviceFactory.create() } } class MyService @Inject constructor() { ... } ``` 5. **运行Hilt初始化**: 通常,在`MyApplication.onCreate()`或其他适当的生命周期回调,需要初始化Hilt组件: ```kotlin override fun onCreate() { super.onCreate() HiltAndroid.init(this) DaggerMyAppComponent.builder().build().inject(this) } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Awesome_lay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值