当前位置:网站首页>将视图模型转换为使用 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。
边栏推荐
猜你喜欢
QSslSocket has not been declared
铱钌合金/氧化铱仿生纳米酶|钯纳米酶|GMP-Pd纳米酶|金钯复合纳米酶|三元金属Pd-M-Ir纳米酶|中空金铂合金纳米笼核-多空二氧化硅壳纳米酶
【图像分类】2017-MobileNetV1 CVPR
大小端的理解以及宏定义实现的理解
C语言系列——猜名次、猜凶手、打印杨辉三角
壁仞推出全球最大算力芯片,号称以7nm超越英伟达4nm最新GPU
Date picker component (restrict year to set only displayed months)
机器学习模型验证:被低估的重要一环
日期选择器组件(限制年份 设定仅展示的月份)
导入FontForge生成字体
随机推荐
【go】依赖注入
姜还是老的辣,看看老战哥的老底儿和严谨劲儿
leetcode 547.省份数量 并查集
Echart饼状图标注遮盖解决方案汇总
"POJ 3666" Making the Grade problem solution (two methods)
Common functions of Auto.js to find pictures and colors
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
Tf铁蛋白颗粒包载顺铂/奥沙利铂/阿霉素/甲氨蝶呤MTX/紫杉醇PTX等药物
@Autowired annotation --required a single bean, but 2 were found causes and solutions
A fullGC problem troubleshooting caused by groovy
CGO 初步认知和基本数据类型转换
[CNN] Brush SOTA's trick
知识图谱Knowledge Graph
(10) Sequence and deserialization of image data
导入FontForge生成字体
kuberentes Auditing 入门
servlet映射路径匹配解析
PostgreSQL — Installation and Common Commands
饿了么-机构树单选
血红素-金纳米颗粒(Heme-AuNP)复合纳米酶|金纳米颗粒核多孔空心碳纳米球壳([email protected])纳米酶