Android – ShanetworkingPreferences – Context

Quiero crear una class de ayuda para mi ShanetworkingPreference en Android usando kotlin. Lamentablemente, necesito el Context y no quiero configurarlo como parámetro cada vez que una llamada una preference.

Si utilizo un object complementario para el context y lo configuro en el inicio de la aplicación, aparece el siguiente error: 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)

Entonces, ¿cómo get el context sin pasarlo cada vez que llamo a las preferences?

  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: ShanetworkingPreferences by lazy { context.getShanetworkingPreferences("prefs", Context.MODE_PRIVATE) } 

    Puede crear una extension function como la siguiente:

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

    Editar: Aquí está la reference para esta respuesta. Puede verificar cómo refactorizar las util classes utilidades con los trucos de Kotlin y usarlas.

    Edit2:

    Puede cambiar su ayudante a class e iniciar esto en su Application . Que puedes usar donde quieras. Creo que esto es lo que intentas hacer. Vamos a hacerlo.

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

    Y en su class de aplicación:

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

    Y puede usar donde quiera como a continuación:

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

    Creo que el primero es más cercano a las mejores prácticas, pero el segundo también está bien. Puedes usar cual necesitas También hay más ejemplos geniales en el contenido del enlace que proporcioné arriba.

    He encontrado una solución para mi problema. Lo resolví persistiendo la variable ShanetworkingPreferences lugar del context.

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

    La function init se llama en mi class de Application .