我正在使用一个Android应用程序,在该应用程序中,我必须通过观察位于“设置”屏幕中的LiveData
中的SharedPreferences
来更改主屏幕。我正在遵循MVVM体系结构。
我已经检查了这个LiveData with shared preferences,但是它有很多样板,可以为不同类型的SharedPreferences
数据创建不同的类。我正在寻找更通用的东西。这就是为什么我为LiveSharedPreference
和SharedPreferences
类型创建了Kotlin extension functions
类和getter的原因。这是自定义reified
类和LiveData
的getter。
SharedPreferences
但是使用此get函数会给我一个错误:
/**************** LiveSharedPreferences.kt ****************/
class LiveSharedPreferences<T : Any>(
private val sharedPreferences: SharedPreferences, private val preferenceKey: String,
private val defValue: T, private val clas: Class<T>
) : LiveData<T>() {
private val preferenceChangeListener =
SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
if (key == preferenceKey) {
// error in this line
value = sharedPreferences.get(key, defValue)
}
}
override fun onActive() {
super.onActive()
// error in this line
value = sharedPreferences.get(preferenceKey, defValue)
sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
}
override fun onInactive() {
sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
super.onInactive()
}
}
/****** Custom getter with reified type T defined in Extensions.kt ******/
inline fun <reified T: Any> SharedPreferences.get(prefKey: String?, defaultValue: T? = null): T? {
return when (T::class) {
String::class -> getString(prefKey, defaultValue as? String) as T?
Int::class -> getInt(prefKey, defaultValue as? Int ?: -1) as T?
Boolean::class -> getBoolean(prefKey, defaultValue as? Boolean ?: false) as T?
Float::class -> getFloat(prefKey, defaultValue as? Float ?: -1f) as T?
Long::class -> getLong(prefKey, defaultValue as? Long ?: -1) as T?
else -> throw UnsupportedOperationException("Invalid operation")
}
}
我知道这与我处理类型Cannot use 'T' as reified type parameter. Use a class instead
的方式有关。没有太多样板,有什么办法可以解决这个问题?