यहाँ पर कोटलिन डेलीगेटेड प्रॉपर्टीज़ का उपयोग किया गया है, जिन्हें मैंने यहाँ से उठाया था है, लेकिन पर विस्तार किया है और हो रही है / SharedPreference गुण स्थापित करने के लिए एक सरल तंत्र के लिए अनुमति देता है।
के लिए String
, Int
, Long
, Float
या Boolean
, यह मानक SharePreference गेटर (रों) और सेटर (रों) उपयोग करता है। हालाँकि, अन्य सभी डेटा वर्गों के लिए, यह String
सेटर के लिए, क्रमबद्ध करने के लिए GSON का उपयोग करता है । फिर डेटा ऑब्जेक्ट के लिए deserializes, गेटर के लिए।
अन्य समाधानों के समान, इसके लिए जीएसओएन को आपकी श्रेणी फ़ाइल में निर्भरता के रूप में जोड़ना आवश्यक है:
implementation 'com.google.code.gson:gson:2.8.6'
यहां एक सरल डेटा वर्ग का एक उदाहरण दिया गया है जिसे हम साझा करना चाहते हैं और साझा करने के लिए स्टोर कर सकते हैं:
data class User(val first: String, val last: String)
यहाँ एक वर्ग है जो संपत्ति प्रतिनिधियों को लागू करता है:
object UserPreferenceProperty : PreferenceProperty<User>(
key = "USER_OBJECT",
defaultValue = User(first = "Jane", last = "Doe"),
clazz = User::class.java)
object NullableUserPreferenceProperty : NullablePreferenceProperty<User?, User>(
key = "NULLABLE_USER_OBJECT",
defaultValue = null,
clazz = User::class.java)
object FirstTimeUser : PreferenceProperty<Boolean>(
key = "FIRST_TIME_USER",
defaultValue = false,
clazz = Boolean::class.java
)
sealed class PreferenceProperty<T : Any>(key: String,
defaultValue: T,
clazz: Class<T>) : NullablePreferenceProperty<T, T>(key, defaultValue, clazz)
@Suppress("UNCHECKED_CAST")
sealed class NullablePreferenceProperty<T : Any?, U : Any>(private val key: String,
private val defaultValue: T,
private val clazz: Class<U>) : ReadWriteProperty<Any, T> {
override fun getValue(thisRef: Any, property: KProperty<*>): T = HandstandApplication.appContext().getPreferences()
.run {
when {
clazz.isAssignableFrom(String::class.java) -> getString(key, defaultValue as String?) as T
clazz.isAssignableFrom(Int::class.java) -> getInt(key, defaultValue as Int) as T
clazz.isAssignableFrom(Long::class.java) -> getLong(key, defaultValue as Long) as T
clazz.isAssignableFrom(Float::class.java) -> getFloat(key, defaultValue as Float) as T
clazz.isAssignableFrom(Boolean::class.java) -> getBoolean(key, defaultValue as Boolean) as T
else -> getObject(key, defaultValue, clazz)
}
}
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) = HandstandApplication.appContext().getPreferences()
.edit()
.apply {
when {
clazz.isAssignableFrom(String::class.java) -> putString(key, value as String?) as T
clazz.isAssignableFrom(Int::class.java) -> putInt(key, value as Int) as T
clazz.isAssignableFrom(Long::class.java) -> putLong(key, value as Long) as T
clazz.isAssignableFrom(Float::class.java) -> putFloat(key, value as Float) as T
clazz.isAssignableFrom(Boolean::class.java) -> putBoolean(key, value as Boolean) as T
else -> putObject(key, value)
}
}
.apply()
private fun Context.getPreferences(): SharedPreferences = getSharedPreferences(APP_PREF_NAME, Context.MODE_PRIVATE)
private fun <T, U> SharedPreferences.getObject(key: String, defValue: T, clazz: Class<U>): T =
Gson().fromJson(getString(key, null), clazz) as T ?: defValue
private fun <T> SharedPreferences.Editor.putObject(key: String, value: T) = putString(key, Gson().toJson(value))
companion object {
private const val APP_PREF_NAME = "APP_PREF"
}
}
नोट: यदि आप में अद्यतन कुछ भी करने की जरूरत नहीं होनी चाहिए sealed class
। प्रत्यायोजित गुण ऑब्जेक्ट / सिंगलटन हैं UserPreferenceProperty
, NullableUserPreferenceProperty
औरFirstTimeUser
।
SharedPreferences से बचत / प्राप्त करने के लिए एक नई डेटा ऑब्जेक्ट को सेटअप करने के लिए, अब चार पंक्तियों को जोड़ना जितना आसान है:
object NewPreferenceProperty : PreferenceProperty<String>(
key = "NEW_PROPERTY",
defaultValue = "",
clazz = String::class.java)
अंत में, आप केवल by
कीवर्ड का उपयोग करके शेयर्डपिरिफायर को मान पढ़ / लिख सकते हैं :
private var user: User by UserPreferenceProperty
private var nullableUser: User? by NullableUserPreferenceProperty
private var isFirstTimeUser: Boolean by
Log.d("TAG", user) // outputs the `defaultValue` for User the first time
user = User(first = "John", last = "Doe") // saves this User to the Shared Preferences
Log.d("TAG", user) // outputs the newly retrieved User (John Doe) from Shared Preferences