android - 将 sharedPreference 对象包装在 hilt 中的最佳方法
问题描述
我有一个 sharedPreference 对象,我想通过项目将其作为依赖注入组件。
// sharedPreference object
private const val PREF_TAG = "tag"
object MyPreference {
fun getStoredTag(context: Context): String {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getString(PREF_TAG, "")!!
}
fun setStoredTag(context: Context, query: String) {
PreferenceManager.getDefaultSharedPreferences(context)
.edit()
.putString(PREF_TAG, query)
.apply()
}
}
// How to correctly inject the sharedPreference?
// create a module?
@Module
@InstallIn(SingletonComponent::class)
object PreferenceModule {
@Provides
@Singleton
fun provideSharedPreference(): SharedPreferences {
return MyPreference()
}
}
// or directly inject in viewModel
class LoginViewModel @ViewModelInject constructor(
application: Application,
myPreference: MyPreference
) : AndroidViewModel(application) {
...
}
// or another way?
解决方案
这是一个基于意见的答案,但至少我会给你一个遵循的方向。
您通常会SharedPreferences
在包装类中维护一个实例。所以...
- 使用常规
class
而不是object
声明 - 既然要
Hilt
设置,可以直接对类使用hilt注解,直接注入Context
到构造函数中
@Singleton
class MyPreference @Inject constructor(@ApplicationContext context : Context){
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
fun getStoredTag(): String {
return prefs.getString(PREF_TAG, "")!!
}
fun setStoredTag(query: String) {
prefs.edit().putString(PREF_TAG, query).apply()
}
}
- 然后你不需要 a
Module
,你可以简单地使用@ViewModelInject
class LoginViewModel @ViewModelInject constructor(
application: Application,
myPreference: MyPreference
) : AndroidViewModel(application) {
...
}
推荐阅读
- c# - 如何更新 Listview(Windows 窗体)?
- flutter - 如何在 Flutter 中将此介绍页面添加到我的应用程序中?
- xamarin - 从 CollectionView 中移除波纹效果
- ruby - 为什么包括?对于 Ruby 返回 false?
- rust - Rust 帮助提取 ZIP 内容
- vb.net - vb.net 必须单击按钮两次
- scala - 有没有办法使用火花数据框根据列条件从地图中获取键?
- sql - SQL - 不存在的列
- databricks - 在笔记本中的 Databrick 上,报告缺少 spacy jsonschema,但已安装
- spring-boot - Srping Security + Zuul + Nginx Authentication 错误处理