当前位置:网站首页>将视图模型转换为使用 Hilt 依赖注入
将视图模型转换为使用 Hilt 依赖注入
2022-08-10 20:29:00 【程序员小何SS】
1.添加依赖和@HiltAndroidApp
初始设置步骤与以下完全相同:
- 设置 Hilt 依赖项
- 在您的应用程序类中添加@HiltAndroidApp
2.添加@HiltViewModel和@Inject Constructor
为了创建 Hilt MainViewModel,您需要使用@HiltViewModel. @Inject constructor也用于告诉 Hilt 如何创建依赖项。
@HiltViewModel
class MainViewModel
@Inject constructor(
private val repository: ArticlesRepository,
) : ViewModel() {
...
}
我@Inject Constructor也在SqlArticlesRepository.
class SqlArticlesRepository @Inject constructor(
private val database: ArticlesDatabase,
private val webService: WebService,
) : ArticlesRepository {
...
}
3.添加@Provides和@Binds
要创建依赖项,我们使用@Provides和@Binds。@Provides用于创建ArticlesDatabase和WebService实例。
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext appContext: Context): ArticlesDatabase {
return Room.databaseBuilder(
appContext,
ArticlesDatabase::class.java,
"articles.db",
)
.fallbackToDestructiveMigration()
.build()
}
}
@Module
@InstallIn(SingletonComponent::class)
object WebServiceModule {
@Provides
@Singleton
fun provideWebService(): WebService {
return WebService()
}
}
@Binds用于创建ArticlesRepository接口的实现。
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindArticlesRepository(impl: SqlArticlesRepository): ArticlesRepository
}
4.调用hiltViewModel()可组合
现在完成了!MainActivity可以删除下面的所有手动创建。
private val repository by lazy {
SqlArticlesRepository(
ArticlesDatabase.getInstance(application),
WebService(),
)
}
private val homeViewModel by viewModels<MainViewModel> {
MainViewModelFactory(repository)
}
MainViewModel可以通过调用可组合函数来完成创建,该hiltViewModel()函数会生成所有必要的依赖项。
例如,替换这个MainScreen可组合函数
MainScreen(homeViewModel, useSystemUIController = true)
和
MainScreen(viewModel = hiltViewModel(), useSystemUIController = true)
下面的数据库创建也可以删除,因为它是由@Provides上面的 hilt 提供的。
companion object {
@Volatile
private lateinit var instance: ArticlesDatabase
fun getInstance(context: Context): ArticlesDatabase {
synchronized(this) {
if (!::instance.isInitialized) {
instance = Room.databaseBuilder(
context.applicationContext,
ArticlesDatabase::class.java,
"articles.db")
.fallbackToDestructiveMigration()
.build()
}
return instance
}
}
}
这MainViewModelFactory也可以被删除,因为这已经被@HiltViewModel.
@Suppress("UNCHECKED_CAST")
class MainViewModelFactory(private val repository: ArticlesRepository)
: ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
结论
我安装的所有 Hilt 模块都在SingletonComponent范围内。如果我将已安装的模块更改为另一个组件,例如ViewModelComponentor ActivityComponent,它将无法编译,并且我不知道如何修复它,我想这是我下一步要解决这个问题Hilt。
边栏推荐
- Single-click to cancel the function
- [SWPUCTF 2021 新生赛] web
- 如何提高代码的可读性 学习笔记
- Water-soluble alloy quantum dot nanozymes|CuMoS nanozymes|porous silicon-based Pt(Au) nanozymes|[email protected] nanomimetic e
- Auto.js中APP应用相关指令
- 1D Array Dynamics and Question Answers
- 图扑智慧电力可视化大屏,赋能虚拟电厂精准减碳
- 测试开发【Mock 平台】08 开发:项目管理(四)编辑功能和Component抽离
- UE4 - 河流流体插件Fluid Flux
- 什么是抽象类?什么时候用?什么是接口?抽象类与接口的区别?
猜你喜欢
【一致性hash】负载均衡器分发请求
.NET现代应用的产品设计 - DDD实践
每日一R「03」Borrow 语义与引用
三子棋的设计和代码
【CMU博士论文】视频多模态学习:探索模型和任务复杂性,152页pdf
svg+元素js实现在图片上描点成框,并获取相对图片的坐标位置
知识图谱Knowledge Graph
idea插件 协议 。。 公司申请软件用
"Distributed Microservice E-commerce" Topic (1) - Project Introduction
@Autowired annotation --required a single bean, but 2 were found causes and solutions
随机推荐
ansible各个模块的详解和使用
OPPO Enco X2 迎来秋季产品升级 旗舰体验全面拉满
苹果字体查找
Water-soluble alloy quantum dot nanozymes|CuMoS nanozymes|porous silicon-based Pt(Au) nanozymes|[email protected] nanomimetic e
CGO 初步认知和基本数据类型转换
Date picker component (restrict year to set only displayed months)
用汇编带你看Golang里到底有没有值类型、引用类型
@Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
测试开发【Mock 平台】08 开发:项目管理(四)编辑功能和Component抽离
LeetCode 1-10题
cordova installation error Command failed: powershell solution
CMU博士论文 | 视频多模态学习:探索模型和任务复杂性
2021年中国工业互联网安全大赛(福建省选拔赛) 暨首届福建省工业互联网创新大赛
echart 特例-多分组X轴
Single-click to cancel the function
关于 NFT 版权保护的争议
详叙c中的分支与循环
(10) Sequence and deserialization of image data
C 语言 时间函数使用技巧(汇总)
三子棋的设计和代码