আমি এখান থেকে তুলেছি এমন কোটলিন প্রতিনিধি সম্পত্তি ব্যবহার করার জন্য এখানে একটি পদক্ষেপ নেওয়া হয়েছে , তবে এতে প্রসারিত হয়েছে এবং 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