Propriété par défaut paresseuse de Kotlin

Dans Kotlin, comment définir un var qui a une valeur par défaut par défaut?

Par exemple, un val serait quelque chose comme ceci:

  • Quelle est la syntaxe de "non égal" dans SQLite?
  • Arrêtez Android Studio des méthodes d'emballage et des constructeurs
  • Comment puis-je installer une application dans le dossier de données / applications au lieu du dossier système / application dans une version AOSP?
  • Données de synchronisation Android entre utilisateurs
  • Android-Comment exécuter Service dans un thread différent du thread principal?
  • Bouton Android des applications récentes d'interception
  •  val toolbarColor by lazy {color(R.color.colorPrimary)} 

    Ce que je veux faire est, ont une valeur par défaut pour certaines propriétés ( toolbarColor ), et je peux changer cette valeur pour toute autre chose. C'est possible?

    EDIT: Cela fait le tour partiel.

     var toolbarColor = R.color.colorPrimary get() = color(field) set(value){ field = value } 

    Est-il possible de faciliter cela en écrivant

     var toolbarColor = color(R.color.colorPrimary) set(value){ field = value } 

    De sorte que la valeur par défaut est calculée paresseusement? Atm ne fonctionnera pas car color () a besoin d'un contexte qui n'est initialisé plus tard.

  • Remplacez les images du sélecteur par programme
  • IllegalArgumentException: colonne non valide
  • Android Beam: lance une application avec enregistrement de type MIME
  • Où sont passées les flèches?
  • NullPointerException sur android.widget.ArrayAdapter.createViewFromResource
  • Remplacez Retrolambda avec Android Studio 3.0 Java 8 fonctionnalités intégrées
  • 2 Solutions collect form web for “Propriété par défaut paresseuse de Kotlin”

    Vous pouvez créer votre propre méthode de délégué:

     private class ColorDelegate<T>(initializer: () -> T) : ReadWriteProperty<Any?, T> { private var initializer: (() -> T)? = initializer private var value: T? = null override fun getValue(thisRef: Any?, property: KProperty<*>): T { return value ?: initializer!!() } override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value } } 

    Déclarez-vous dans un délégué:

     object DelegatesExt { fun <T> lazyColor(initializer: () -> T): ReadWriteProperty<Any?, T> = ColorDelegate(initializer) } 

    Et utilisez comme suit:

     var toolbarColor by DelegatesExt.lazyColor { // you can have access to your current context here. // return the default color to be used resources.getColor(R.color.your_color) } ... override fun onCreate(savedInstanceState: Bundle?) { // some fun code // toolbarColor at this point will be R.color.your_color // but you can set it a new value toolbarColor = resources.getColor(R.color.new_color) // now toolbarColor has the new value that you provide. } 

    Je pense que cela pourrait être un moyen plus propre à faire, mais je ne sais pas encore (en commençant par kotlin il y a quelques jours). Je vais jeter un oeil et voir si cela pourrait se faire avec moins de code.

    Vous pouvez stocker votre propriété dans une carte pour créer fondamentalement un paresseux mutable. Vous avez besoin d'une carte mutable (comme un HashMap<K, V> ) avec une fonction par défaut pour déléguer à:

     var toolbarColor by hashMapOf<String, Any?>() .withDefault { toolbarColor = R.color.colorPrimary; toolbarColor } 

    Vous devrez également importer certaines fonctions d'extension: import kotlin.properties.getValue et import kotlin.properties.setValue .

    Ce serait bien si Kotlin a fourni quelque chose intégré et optimisé pour cela (comme un mutableLazy ou quelque chose). En tant que tel, j'ai créé KT-10451 .

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.