如何制作通用的LiveData类来处理SharedPreferences?

时间:2019-09-02 10:21:23

标签: android generics kotlin kotlin-reified-type-parameters

我正在使用一个Android应用程序,在该应用程序中,我必须通过观察位于“设置”屏幕中的LiveData中的SharedPreferences来更改主屏幕。我正在遵循MVVM体系结构。

我已经检查了这个LiveData with shared preferences,但是它有很多样板,可以为不同类型的SharedPreferences数据创建不同的类。我正在寻找更通用的东西。这就是为什么我为LiveSharedPreferenceSharedPreferences类型创建了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的方式有关。没有太多样板,有什么办法可以解决这个问题?

0 个答案:

没有答案