美文网首页
Hilt相关

Hilt相关

作者: 流水线上的程序员 | 来源:发表于2021-09-16 15:17 被阅读0次

    Hilt

    什么是Hilt

    Hilt是google提供的jectpack组件中的其中一种,是一个依赖注入的框架,是基于dagger的。

    能做什么

    Hilt能够实现自动注入,数据共享

    用法

    1. 首先引入gradle中引入依赖
     implementation 'com.google.dagger:hilt-android:2.28-alpha'
    

    如果是kotlin需要加入

     kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
    

    如果使用的java

    annotationProcessor 'com.google.dagger:hilt-android-compiler:2.28-alpha'
    

    另外支持了对ViewModel的扩展

     implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
      // When using Kotlin.
     kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
       // When using Java.
     annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
    
    1. 在自定义的Application类上加入注解@HiltAndroidApp表示要使用以来注入了
    @HiltAndroidApp
    class BaseApp : Application() {
    
    }
    
    1. 自定义的实体类
    data class Driver  constructor(var name:String) {
        //带参数的
        @Inject constructor():this("张三")
    
    }
    
    class Truck @Inject constructor(private val driver: Driver) {
    }
    
    1. 在Activity中需要注入,在Activity类上加入注解@AndroidEntryPoint
    @AndroidEntryPoint
    class MainActivity : AppCompatActivity() {
        @Inject
        lateinit var truck: Truck
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            button.setOnClickListener {
                truck.driverTruck()
            }
        }
    
    }
    
    1. 如果是第三方框架我们要如何注入呢?这里使用Retrofit来示例
    @Module
    @InstallIn(ApplicationComponent::class)
    class NetworkModule{
    
        @Provides
        @Singleton
        fun providerOkHttpClient():OkHttpClient =OkHttpClient.Builder().build()
    
        @Provides
        @Singleton
        fun providerRetrofit(okHttpClient: OkHttpClient):Retrofit{
            return Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl("https://www.wanandroid.com/")
                .build()
        }
    
        @Provides
        @Singleton
        fun providerService(retrofit: Retrofit):Api= retrofit.create(Api::class.java)
    }
    

    @Module表示当前类可以提供注入组件

    @Provides标识当类型可以被注入

    @Singleton当前注入对象的作用域

    @InstallIn(ApplicationComponent::class) 当前组件的作用域

    1. 如果使用ViewModel我们如何注入呢@ViewModelInject
    class SecondViewModel @ViewModelInject constructor(val user:User): ViewModel() {
    
        fun showUser(){
            Log.e("TAG", "showUser: ${user.userName}")
        }
    }
    

    在activity或者fragment中就可以使用

    val viewModel by lazy{
          ViewModelProvider(this).get(SecondViewModel::class.java)
    }
    
    1. 接口使用依赖注入用法
      先定义一个Animal的接口
    interface Animal {
    
        fun eat()
        fun run()
    }
    

    创建两个接口的实现类

    class Cat @Inject constructor() :Animal {
        override fun eat() {
            Log.e("TAG","Cat is Eating")
        }
    
        override fun run() {
            Log.e("TAG","Cat is Running")
        }
    }
    
    class Dog @Inject constructor() :Animal {
        override fun eat() {
            Log.e("TAG","Dog is Eating")
        }
    
        override fun run() {
            Log.e("TAG","Dog is Running")
        }
    }
    

    创建一个抽象类

    @Module
    @InstallIn(ApplicationComponent::class)
    abstract class AnimalModule {
        @Binds
        @BindDogAnimal
        abstract fun getDog(dog: Dog):Animal
    
        @Binds
        @BindCatAnimal
        abstract  fun getCat(cat: Cat):Animal
    }
    
    @Qualifier
    @Retention(AnnotationRetention.BINARY)
    annotation class BindDogAnimal
    
    @Qualifier
    @Retention(AnnotationRetention.BINARY)
    annotation class BindCatAnimal
    

    在Activity中使用

    @AndroidEntryPoint
    class AnimalActivity : AppCompatActivity() {
    
        @BindDogAnimal
        @Inject
        lateinit var dog: Animal
    
        @BindCatAnimal
        @Inject
        lateinit var cat: Animal
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding =
                DataBindingUtil.setContentView<ActivityAnimalBinding>(this, R.layout.activity_animal)
            binding.btDog.setOnClickListener {
                dog.eat()
                dog.run()
            }
            binding.btCat.setOnClickListener {
                cat.eat()
                cat.run()
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Hilt相关

          本文链接:https://www.haomeiwen.com/subject/itwrgltx.html