- 一,添加依赖库
添加依赖库app build.gradle.kts
implementation("com.google.dagger:hilt-android:2.49")
annotationProcessor("com.google.dagger:hilt-android:2.49")
annotationProcessor("com.google.dagger:hilt-compiler:2.49")
添加插件app build.gradle.kts
plugins {
id("dagger.hit.android.plugin")
}
添加插件项目中 build.gradle.kts
plugins {
id("com.google.dagger.hilt.android") version "2.49" apply false
}
- 二,基本用法
1,自动生成对应组件,需要自定义application
//生成相应组件,Hilt会自动生成所需要的组件
@HiltAndroidApp
public class HiltApplication extends Application {
}
public class User {
//构造器注入创建
@Inject
public User() {
Log.e("User", "new User()");
}
}
2,注入调用
//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {
//需要注入的实例化类
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity", "new onCreate");
}
}
打印如下
从打印中可以发现,Hilt的注入对象是我们打印位置之前的
- 三,@Module注入,局部单利
改造代码如下
public class User {
public User() {
Log.e("User", "new User()");
}
}
//将module加入对应作用域的容器,这里是ActivityComponent,作用域是 @ActivityScoped
@InstallIn(ActivityComponent.class)
@Module
public class UserMOdule {
//添加activity的作用域 @ActivityScoped后,该类的在activity为单利
@ActivityScoped
@Provides
User provideUser() {
return new User();
}
}
//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {
//需要注入的实例化类
@Inject
User user;
@Inject
User user1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity", "new onCreate");
}
}
代码打印如下
这里进行了多次注入User对象,实际上User的构造器之调用了一次,表明之创建了一次,所以这几个对象都指向这个创建的对象,所以在该类中为单利
- 四,@Module注入,全局单利
修改代码如下
1,module
//SingletonComponent全局单利容器,其余的容器都是这个容器的子容器
@InstallIn(SingletonComponent.class)
@Module
public class UserMOdule {
//添加单利全局单利作用域,该方法只会被调用一次
@Singleton
@Provides
User provideUser() {
return new User();
}
}
2,调用
//Hilt会自动创建注入方法,然后通过注入方法注入对象,必须是ComponentActivity或者ComponentActivity的子类
@AndroidEntryPoint
public class MainActivity extends ComponentActivity {
//需要注入的实例化类
@Inject
User user;
@Inject
User user1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity", "MainActivity new onCreate");
startActivity(new Intent(this,MainActivity2.class));
}
}
@AndroidEntryPoint
public class MainActivity2 extends AppCompatActivity {
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
Log.e("MainActivity", "MainActivity2 new onCreate");
}
}
调用打印
这里User创建了一次,和前面所讲对应
- 五,Context类的注入
修改代码
public class User {
public User(Context context) {
Log.e("User", "new User() context " + context);
}
}
//SingletonComponent全局单利容器,其余的容器都是这个容器的子容器
@InstallIn(SingletonComponent.class)
@Module
public class UserMOdule {
//添加单利全局单利作用域,该方法只会被调用一次
@Singleton
@Provides
User provideUser(@ApplicationContext Context context) {
return new User(context);
}
}
打印如下
这样就传入了Application的context了
参考
Android之Dagger&Hilt依赖注入使用指南-CSDN博客
一看就会 Android中Hilt的各场景使用_android hilt-CSDN博客