Android

Android Hilt使用

2023-02-20  本文已影响0人  翟小乙

前言

Hilt 是基于Dagger封装衍生而来,使用起来更加简单,基于上一章Dagger讲解的快递和快递员,Hilt其实就是相当于Dagger2的快递员,以下我们是基于Hilt插件 2.28来讲解,最新的可以看官网最新版

上一篇-Android Dagger2使用
一. 引用Hilt
  1. 项目的build.gradle 中引入插件
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.41'
  1. App的build.gradle 中引入插件
dependencies {
    // hilt 的功能支持
    implementation 'com.google.dagger:hilt-android:2.28-alpha'
    // hilt 自己的注解处理器
    annotationProcessor 'com.google.dagger:hilt-android-compiler:2.28-alpha'
}
  1. App的build.gradle 中应用插件
plugins {
    id 'dagger.hilt.android.plugin'
}
二.使用Hilt
  1. 自定义Application增加注解 @HiltAndroidApp
@HiltAndroidApp
public class MyApplication extends Application {

}
  1. 创建实体类(快递)
// 正常业务的一个对象
public class UerInfo {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
  1. 创建包裹-->并分发快递

注解 @InstallIn 是告诉用户应用于哪些组件,而应用于哪些组件对应的会有生命周期范围如:ApplicationComponent.class)对应注解@Singleton 存在于应用生命周期。

@InstallIn(ApplicationComponent.class)
@Module
public class UerInfoModle {
    @Provides
    @Singleton
    public UerInfo uerInfoInit(){
        return  new UerInfo();
    }
}
  1. 使用接收快递

注解 @AndroidEntryPoint 是谁接收就增加注解

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
    @Inject
    UerInfo uerInfo1;
    @Inject
    UerInfo uerInfo2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        TextView textView = findViewById(R.id.txtView);
        String msg  = "全局-----"+uerInfo1.hashCode()+"----"+uerInfo2.hashCode();
        
    }
}
三.目标组件和组件作用域
  1. 目标组件

例如:如果在Activity中使用就需要使用注解@ActivityComponent

使用目标组件.png
  1. 组件作用域

如果在Activity中使用就需要使用注解@ActivityComponent,若在Activity内则单例则使用注解@ActivityScoped

1676964687418.png
四. Hilt 的@Binds注解

以 AnalyticsService 为例。如果 AnalyticsService 是一个接口,则您无法通过构造函数注入它,而应向 Hilt 提供绑定信息,方法是在 Hilt 模块内创建一个带有 @Binds 注解的抽象函数。@Binds 注解会告知 Hilt 在需要提供接口的实例时要使用哪种实现。

带有注解的函数会向 Hilt 提供以下信息:

接口

public interface AnalyticsService {
  void analyticsMethods();
}

AnalyticsServiceImpl的实例

//构造函数被注入,因为Hilt需要知道如何
//提供AnalyticsServiceImpl的实例
public class AnalyticsServiceImpl implements AnalyticsService {
  ...
  @Inject
  AnalyticsServiceImpl(...) {
    ...
  }
}

注入实例

@Module
@InstallIn(ActivityComponent.class)
public abstract class AnalyticsModule {

  @Binds
  public abstract AnalyticsService bindAnalyticsService(
    AnalyticsServiceImpl analyticsServiceImpl
  );
}
上一篇 下一篇

猜你喜欢

热点阅读