IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin开发Android App和Java的差异6----Kotlin中使用Hilt依赖注入 -> 正文阅读

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

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修饰构造函数

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:55:57  更:2021-12-08 13:57:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:56:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码