将 sharedPreference 对象包装在刀柄中的最佳方式
The best way to wrap sharedPreference object in 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?
这个回答有点opinion-based,但至少我会给你一个方向。
您通常会在包装器 class 中维护一个 SharedPreferences
的实例。所以...
- 使用常规
class
而不是 object
声明
- 既然你想有一个
Hilt
设置,你可以直接为class使用刀柄注释,直接将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()
}
}
- 那么你不需要
Module
,你可以简单地使用@ViewModelInject
class LoginViewModel @ViewModelInject constructor(
application: Application,
myPreference: MyPreference
) : AndroidViewModel(application) {
...
}
使用 Hilt 2.38.1:
SharedPreferencesModule.kt
@Module
@InstallIn(SingletonComponent::class)
class SharedPreferencesModule {
@Singleton
@Provides
fun provideSharedPreference(@ApplicationContext context: Context): SharedPreferences {
return context.getSharedPreferences("preferences_name", Context.MODE_PRIVATE)
}
}
CustomViewModel.kt
@HiltViewModel
class CustomViewModel @Inject constructor(
private val sharedPreferences: SharedPreferences
):ViewModel() {
fun customFunction() {
sharedPreferences.edit().putString("firstStoredString", "this is the content").apply()
val firstStoredString = sharedPreferences.getString("firstStoredString", "")
}
...
我有一个 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?
这个回答有点opinion-based,但至少我会给你一个方向。
您通常会在包装器 class 中维护一个 SharedPreferences
的实例。所以...
- 使用常规
class
而不是object
声明 - 既然你想有一个
Hilt
设置,你可以直接为class使用刀柄注释,直接将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()
}
}
- 那么你不需要
Module
,你可以简单地使用@ViewModelInject
class LoginViewModel @ViewModelInject constructor(
application: Application,
myPreference: MyPreference
) : AndroidViewModel(application) {
...
}
使用 Hilt 2.38.1:
SharedPreferencesModule.kt
@Module
@InstallIn(SingletonComponent::class)
class SharedPreferencesModule {
@Singleton
@Provides
fun provideSharedPreference(@ApplicationContext context: Context): SharedPreferences {
return context.getSharedPreferences("preferences_name", Context.MODE_PRIVATE)
}
}
CustomViewModel.kt
@HiltViewModel
class CustomViewModel @Inject constructor(
private val sharedPreferences: SharedPreferences
):ViewModel() {
fun customFunction() {
sharedPreferences.edit().putString("firstStoredString", "this is the content").apply()
val firstStoredString = sharedPreferences.getString("firstStoredString", "")
}
...