Как правильно использовать SharedPreferences?

У меня есть класс, в котором описывается работа с SharedPreferences:

class TextPreferences(context: Context) {

    private val PREFS_FILENAME = TextPreferences::class.java.simpleName
    val TEXT = "TEXT" 
    private var pref: SharedPreferences? = null

    fun getText(): String? {
        return pref?.getString(TEXT, null)
    }

    fun setText(res: String) {
        val editor = pref?.edit()
        editor?.putString(TEXT, res)
        editor?.apply()
    }

    init {
        pref = context.getSharedPreferences(
            PREFS_FILENAME,
            Context.MODE_PRIVATE
        )
    }
}

В одном из классов я устанавливаю значение для Preferences методом setText(), а в остальных классах (их порядка десяти), нужно извлечь это значение, методом getText().

Код фрагмента, в котором извлекается значение TextPreferences:

class MyFragment: BaseFragment() {
    
    private var prefs: TextPreferences? = null
    
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            prefs = TextPreferences(requireActivity().baseContext)
    
            val someString = prefs?.getText()
    }
}

Вопрос в том, правильно ли я работаю с Preferences? Правильно ли в каждом классе создавать по объекту типа TextPreferences, чтобы извлечь из него значение? А если надо будет в 1000 классах извлечь значение, то ведь придётся создать 1000 таких объектов. Может я не правильно что-то понимаю?


Ответы (1 шт):

Автор решения: Cypher

Я делаю следующим образом. Создаю Extension-функции:

fun SharedPreferences.putAny(key: String, any: Any) {
  when (any) {
    is String -> edit { putString(key, any) }
    is Int -> edit { putInt(key, any) }
  }
}

fun SharedPreferences.getAny(type: Any, key: String) = when (type) {
  is String -> getString(key, "") as Any
  else -> getInt(key, 0)
}

А SharedPreferences инжекчу с помощью Koin во ViewModel или во Fragment

preferences.putAny(TOKEN, "")
val lat = preferences.getAny("", LATITUDE) as String
→ Ссылка