আমি এখান থেকে তুলেছি এমন কোটলিন প্রতিনিধি সম্পত্তি ব্যবহার করার জন্য এখানে একটি পদক্ষেপ নেওয়া হয়েছে , তবে এতে প্রসারিত হয়েছে এবং SharedPreferences বৈশিষ্ট্যগুলি পেতে / সেট করার জন্য একটি সহজ পদ্ধতির অনুমতি দেয়।
জন্য String, Int, Long, Floatবা Boolean, এটা মান SharePreference সংগ্রহকারী (গুলি) এবং সেটার (গুলি) ব্যবহার করে। তবে অন্যান্য সমস্ত ডেটা ক্লাসের জন্য এটি জিএসওএন ব্যবহার করে সেটারের জন্য সিরিয়ালায়িত করতে String। তারপরে গ্রাহকের জন্য ডেটা অবজেক্টে ডিসরিয়ালাইজ করা হয়।
অন্যান্য সমাধানের মতো, এর জন্য আপনার গ্রেড ফাইলটিতে নির্ভরতা হিসাবে জিএসওএন যুক্ত করা দরকার:
implementation 'com.google.code.gson:gson:2.8.6'
এখানে একটি সাধারণ ডেটা ক্লাসের একটি উদাহরণ রয়েছে যা আমরা SharedPreferences এ সংরক্ষণ এবং সঞ্চয় করতে সক্ষম হতে চাই:
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। অর্পণ বৈশিষ্ট্য অবজেক্ট / Singletons হয় 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