Android hilt使用

  • 一,添加依赖库

添加依赖库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博客

相关推荐
驰骋工作流4 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程6 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽10 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app
weixin_5633714710 小时前
Android Studio 2024 版 Device Explorer 打开方法
android·ide·android studio
AIsoft_868913 小时前
职场音频文件怎么整理?录音APP有哪些用法
android·音视频
booboosui13 小时前
第一批个人 Agent 用户正在卸载,问题不在模型,在它住在哪儿
android
洞见前行13 小时前
点击图标到内容出现,你的 App 在这几秒里做了什么:Android 冷启动全链路优化实战
android·性能优化·android studio
凯基迪科技13 小时前
芯片UID绑定修改 加密与逆向修改思路分析
android
Liben14 小时前
Weex开发踩坑记录
android·前端·ios
救救孩子把16 小时前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务