尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JetPack——Hilt
手动依赖注入LoginRetrofitServicepublic class LoginRetrofitService { }UserRemoteDataSourcepublic class UserRemoteDataSource { private final LoginRetrofitService loginService; public UserRemoteDataSource(LoginRetrofitService loginService) { this.loginService loginService; } }UserLocalDataSourcepublic class UserLocalDataSource { }UserRepositorypublic class UserRepository { private final UserLocalDataSource localDataSource; private final UserRemoteDataSource remoteDataSource; public UserRepository(UserLocalDataSource localDataSource, UserRemoteDataSource remoteDataSource) { this.localDataSource localDataSource; this.remoteDataSource remoteDataSource; } }LoginViewModelFactorypublic class LoginViewModelFactory implements ViewModelProvider.Factory { private final UserRepository userRepository; public LoginViewModelFactory(UserRepository userRepository) { this.userRepository userRepository; } NonNull Override SuppressWarnings(unchecked) public T extends ViewModel T create(NonNull ClassT modelClass) { return (T) new LoginViewModel(userRepository); } }LoginViewModelpublic class LoginViewModel extends ViewModel { private final UserRepository userRepository; public LoginViewModel(UserRepository userRepository) { this.userRepository userRepository; } }ManualLoginActivity想要获取LoginViewModel需要根据依赖关系依次创建LoginRetrofitService、UserLocalDataSource、UserRemoteDataSource、UserRepository、LoginViewModelFactorypublic class ManualLoginActivity extends AppCompatActivity { private static final String TAG ManualLoginActivity.class.getSimpleName(); private LoginViewModel loginViewModel; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LoginRetrofitService loginService new LoginRetrofitService(); UserLocalDataSource localDataSource new UserLocalDataSource(); UserRemoteDataSource remoteDataSource new UserRemoteDataSource(loginService); UserRepository userRepository new UserRepository(localDataSource, remoteDataSource); LoginViewModelFactory factory new LoginViewModelFactory(userRepository); loginViewModel new ViewModelProvider(this, factory).get(LoginViewModel.class); String msg 【手动DI】依赖注入成功,ViewModel loginViewModel; Log.d(TAG, msg); showText(msg); } private void showText(String text) { TextView tv new TextView(this); tv.setText(text); tv.setGravity(Gravity.CENTER); tv.setTextColor(Color.BLACK); tv.setPadding(32, 200, 32, 32); setContentView(tv); } }Hilt实现依赖项注入可为您带来以下优势重用代码易于重构易于测试Hilt 是 Android 的依赖项注入库可减少在项目中执行手动依赖项注入的样板代码依赖libs.version.toml[versions] ...... ksp 2.0.20-1.0.24 hilt 2.57.1 [libraries] ...... hilt-android { group com.google.dagger, name hilt-android, version.ref hilt } hilt-compiler { group com.google.dagger, name hilt-compiler, version.ref hilt } [plugins] ...... ksp { id com.google.devtools.ksp, version.ref ksp } hilt { id com.google.dagger.hilt.android, version.ref hilt }build.gradle根目录plugins { ...... alias(libs.plugins.ksp) apply false alias(libs.plugins.hilt) apply false }build.gradle项目目录android { ...... compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget 17 } } plugins { ...... alias(libs.plugins.ksp) alias(libs.plugins.hilt) } dependencies { ...... implementation libs.hilt.android ksp libs.hilt.compiler }Hilt 依赖注入MyApplicationHiltAndroidApp public class MyApplication extends Application { private static MyApplication instance; Override public void onCreate() { super.onCreate(); instance this; } public static Context getContext() { return instance; } }LoginRetrofitServicepublic class LoginRetrofitService { Inject public LoginRetrofitService() { } }UserRemoteDataSourcepublic class UserRemoteDataSource { private final LoginRetrofitService loginService; Inject public UserRemoteDataSource(LoginRetrofitService loginService) { this.loginService loginService; } }UserLocalDataSourcepublic class UserLocalDataSource { Inject public UserLocalDataSource() { } }UserRepositorySingleton 全 App 共享一个Singleton public class UserRepository { private final UserLocalDataSource localDataSource; private final UserRemoteDataSource remoteDataSource; Inject public UserRepository(UserLocalDataSource localDataSource, UserRemoteDataSource remoteDataSource) { this.localDataSource localDataSource; this.remoteDataSource remoteDataSource; } }LoginViewModelHiltViewModel 构造函数 Inject → 依赖自动装配,不再需要手写 Factory。HiltViewModel public class LoginViewModel extends ViewModel { private final UserRepository userRepository; Inject public LoginViewModel(UserRepository userRepository) { this.userRepository userRepository; } }HiltLoginActivity为带有 AndroidEntryPoint 注解的其他 Android 类提供依赖项省去new的过程AndroidEntryPoint public class HiltLoginActivity extends AppCompatActivity { private static final String TAG HiltLoginActivity.class.getSimpleName(); private LoginViewModel loginViewModel; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 一行搞定:Hilt 已经把 UserRepository 及其下层依赖全部装配好 loginViewModel new ViewModelProvider(this).get(LoginViewModel.class); String msg 【Hilt】依赖注入成功,ViewModel loginViewModel; Log.d(TAG, msg); showText(msg); } private void showText(String text) { TextView tv new TextView(this); tv.setText(text); tv.setGravity(Gravity.CENTER); tv.setTextColor(Color.BLACK); tv.setPadding(32, 200, 32, 32); setContentView(tv); } }Module和InstallInModule 注解的类向 Hilt 提供有关如何创建无法通过构造函数注入提供的类型例如接口或第三方类的实例InstallIn 告知 Hilt 每个模块将用在或安装在哪个 Android 类中Bind 注入接口public interface DemoInterface { String demo(); }public class DemoImpl implements DemoInterface { Inject public DemoImpl() { } Override public String demo() { return DemoImpl; } }存在接口和具体实现创建一个带有 Binds 注解的抽象函数实现接口的依赖注入返回值为接口参数为实现Module InstallIn(SingletonComponent.class) public abstract class DemoModule { Binds public abstract DemoInterface bind(DemoImpl impl); }AndroidEntryPoint public class HiltModuleActivity extends AppCompatActivity { private static final String TAG HiltModuleActivity.class.getSimpleName(); Inject DemoInterface mDemo; // 业务用接口 Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout root new LinearLayout(this); root.setOrientation(LinearLayout.VERTICAL); root.setPadding(48, 200, 48, 48); TextView tv new TextView(this); tv.setGravity(Gravity.CENTER); tv.setTextColor(Color.BLACK); root.addView(tv); setContentView(root); String msg 当前实现: mDemo.demo(); Log.d(TAG, msg); tv.setText(msg); } }Provides 注入外部库Module InstallIn(SingletonComponent.class) public class DemoModule { Provides public Gson provideGson() { return new GsonBuilder().create(); } }AndroidEntryPoint public class HiltModuleActivity extends AppCompatActivity { Inject Gson gson; // Provides 提供的实例 Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv new TextView(this); tv.setText(Gson实例: gson.toJson(hello Provides)); setContentView(tv); } }Qualifier和RetentionQualifier 为同一类型定义多个绑定Retention 设置注解声明周期如下生成PrettyGson注解用于Gson实例对象的依赖注入Qualifier Retention(RetentionPolicy.RUNTIME) public interface PrettyGson { }Module InstallIn(SingletonComponent.class) public class DemoModule { // 默认绑定:压缩输出。 Provides public Gson provideGson() { return new GsonBuilder().create(); } // 同类型的第二个绑定,靠 PrettyGson 限定符区分,避免和上面的冲突。 Provides PrettyGson public Gson providePrettyGson() { return new GsonBuilder().setPrettyPrinting().create(); } }AndroidEntryPoint public class HiltModuleActivity extends AppCompatActivity { Inject Gson gson; // 默认绑定 Inject PrettyGson Gson prettyGson; // 限定符绑定 Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 用带字段的对象序列化,才能看出 setPrettyPrinting() 的换行缩进效果; // 序列化单个字符串没有结构,两种输出会一样。 MapString, String data new HashMap(); data.put(name, Kiro); data.put(action, Provides demo); String compact gson.toJson(data); String pretty prettyGson.toJson(data); TextView tv new TextView(this); tv.setText(默认Gson: compact \n\nPrettyGson:\n pretty); setContentView(tv); } }自带的预定义限定符如下注入ApplicationContext和ActivityContextInject ApplicationContext Context appContext; Inject ActivityContext Context activityContext;
RELATED

相关推荐

猫抓浏览器资源嗅探扩展怎么用?3步抓取网页视频、音频与图片

猫抓浏览器资源嗅探扩展怎么用?3步抓取网页视频、音频与图片

猫抓浏览器资源嗅探扩展怎么用?3步抓取网页视频、音频与图片 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 凌晨一点,备考…

📅 2026/10/7 21:11:20
2026广州做小程序商城的公司有哪些,广州商城小程序公司怎么比较

2026广州做小程序商城的公司有哪些,广州商城小程序公司怎么比较

广州商城小程序公司怎么比较,不能只把几家报价放在一起。报价只是一个入口,真正要比较的是交付方式、系统成熟度、后台易用性和后续服务。小程序商城不是一次性页面,商家上线后还要持续上新、处理订单、做活动和维护会员。很多广州商家找公司…

📅 2026/9/10 7:06:25
mitmproxy抓包工具

mitmproxy抓包工具

1、下载&安装 访问:https://mitmproxy.org/双击安装,记住安装路径,在移动端安装时,需要证书,默认安装路径为:C:\Program Files\mitmproxy证书:C:\Program Files\mitmproxy\bin_internal\ce…

📅 2026/9/8 23:13:19
MORE NEWS

更多资讯

📰

出租车GPS数据分析:从数据清洗到城市路况建模全流程

简介:一份以深圳市出租车GPS数据为对象、研究城市道路交通状况的数学建模PDF资料,适合数学建模竞赛备赛者、交通数据分析学习者及城市规划相关专业学生。压缩包内共含一个PDF文件,大小约972KB,正文涵盖问题分析、模型假设、符号说…

📰

DeepSeek R1 本地部署实战:Ollama+AnythingLLM 零基础跑通指南

简介:本资源是一份面向AI开发者、数据科学家与内容创作者的DeepSeek R1模型实战指南,系统梳理七大获取路径(官网/App、硅基流动、秘塔搜索、Cursor、Groq、国家超算中心及本地部署)、多场景应用技巧与进阶创意玩法,有效…

📰

AI技术如何革新企业并购估值方法与系统架构

1. AI如何重塑企业并购估值的基本逻辑企业并购估值这个传统金融领域正在经历一场由AI驱动的范式转移。过去投行分析师们需要花费数百小时手工整理的财务数据,现在通过机器学习算法可以在几小时内完成初步分析。但AI带来的远不止效率提升——它正在改变估值方法论本身…

📰

新一代AI基础设施白皮书解读:从算力到Agent的工程化落地

1. 从"尝鲜"到"日常":这份白皮书到底在讲什么如果你最近一年在关注AI圈,应该能明显感觉到一个变化:前两年大家聊大模型,聊的是"这个模型能不能写诗""能不能帮我编个周报",属于…

📰

AI工具链如何提升跨境电商内容生产效率17倍

1. 项目概述:AI工具链如何重塑内容生产全流程在2023年的数字内容爆发潮中,一个标志性现象是:单个AI工具的生产力提升已触及天花板,而工具链协同的价值开始显现。我最近为某跨境电商团队搭建的AI工作流,将品牌视觉设计到…

📰

OpenMontage:开源自动蒙太奇工具,让视频剪辑流程化智能化

1. OpenMontage 是什么:一个把“蒙太奇”变成流程的开源工具1.1 从电影剪辑到自动化拼接“Montage”这个词,懂行的朋友第一反应就是蒙太奇。电影里那种把不同镜头快速衔接、通过节奏和画面组接来传递情绪的技法,一百多年前就被苏联导演玩明白…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬