Android – SharedPreferences – Контекст

Я хочу создать вспомогательный класс для моего SharedPreference в android, используя kotlin. К сожалению, мне нужен Context и я не хочу устанавливать его как параметр каждый раз, когда вы предпочитаете вызов.

Если я использую объект-компаньон для контекста и устанавливаю его при запуске приложения, я получаю следующую ошибку: Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run) Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)

Итак, как получить контекст, не передавая его каждый раз, когда я вызываю настройки?

  var isWorking: Boolean get() = getBoolean(IS_WORKING) set(isWorking) = setPreference(IS_WORKING, isWorking) private fun setPreference(key: String, value: Boolean) { val editor = settings.edit() editor.putBoolean(key, value) editor.commit() } private val settings: SharedPreferences by lazy { context.getSharedPreferences("prefs", Context.MODE_PRIVATE) } 

    Вы можете создать функцию extension function как показано ниже:

     object PreferenceHelper { fun defaultPrefs(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) fun customPrefs(context: Context, name: String): SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE) inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) { val editor = this.edit() operation(editor) editor.apply() } } 

    Изменить: Вот ссылка на этот ответ. Вы можете проверить, как рефакторировать util classes с трюками Kotlin и использовать его.

    Edit2:

    Вы можете изменить свой помощник на класс и инициировать его в своем Application . Затем вы можете использовать все, что захотите. Я думаю, это то, что вы пытаетесь сделать. Давай сделаем это.

     class PreferenceHelper constructor(context: Context){ fun defaultPrefs(): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) fun customPrefs(name: String): SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE) inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) { val editor = this.edit() operation(editor) editor.apply() } } 

    И в вашем классе Application:

     class YourApp : Application() { override fun onCreate() { super.onCreate() YourApp.prefHelper = PreferenceHelper(this) } companion object { lateinit var prefHelper: PreferenceHelper private set } } 

    И вы можете использовать везде, где хотите, как показано ниже:

     YourApp.prefHelper.defaultPrefs().edit { // Your shared pref operations. } 

    Я думаю, что первый из них ближе к передовой практике, но второй тоже хорошо. Вы можете использовать тот, который вам нужен. Кроме того, в приведенном выше разделе ссылок есть более интересные примеры.

    Я нашел решение для своей проблемы. Я решил это, сохранив переменную SharedPreferences вместо контекста.

     object PreferenceDao { private lateinit var settings: SharedPreferences fun init(context: Context) { settings = context.getSharedPreferences("prefs", Context.MODE_PRIVATE) } } 

    Функция init вызывается в моем классе Application .

    Давайте будем гением компьютера.