Если вы не используете инструмент внедрения зависимостей, такой как hilt
, koin
, et c, лучше создать одноэлементный класс, который управляет значениями предпочтений, чтобы не получать SharedPreferences
каждый раз, когда вы хотите прочитать или записать значение. SingletonHolder
помогает вам создать одноэлементный класс с параметрами поточно-ориентированным способом.
В противном случае, если вы используете инструмент внедрения зависимостей в своем проекте, вы можете пропустить одноэлементный класс часть решения ниже, и пусть это сделает инструмент DI.
PrefManager.kt
import android.content.Context
class PrefManager private constructor(context: Context) {
// ------- Preference Variables
var authenticationId: String?
get() = pref.getString("KEY_AUTHENTICATION_ID", null)
set(value) = pref.edit { putString("KEY_AUTHENTICATION_ID", value) }
var authenticationStatus: Boolean
get() = pref.getBoolean("KEY_AUTHENTICATION_STATUS", false)
set(value) = pref.edit { putBoolean("KEY_AUTHENTICATION_STATUS", value) }
// ---------------------------------------------------------------------------------------------
private val pref = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE)
fun clear() = pref.edit { clear() }
companion object : SingletonHolder<PrefManager, Context>(::PrefManager) {
private const val FILE_NAME = "AUTHENTICATION_FILE_NAME"
}
}
SingletonHolder.kt
open class SingletonHolder<out T, in A>(private val constructor: (A) -> T) {
@Volatile
private var instance: T? = null
fun getInstance(arg: A): T {
return when {
instance != null -> instance!!
else -> synchronized(this) {
if (instance == null) instance = constructor(arg)
instance!!
}
}
}
}
Использование:
Теперь мы можем читать значение, подобное следующему:
val authenticationId = PrefManager.getInstance(context).authenticationId
и для записи:
PrefManager.getInstance(context).authenticationId = "SOME VALUE"