2017-08-30 7 views
2

Voici mon code. Comme vous pouvez le voir, le corps de l'application est exactement le même. Y at-il une meilleure fonction d'extension d'utilisation?Comment grouper l'instruction dupliquée dans .apply dans Kotlin?

contentText?.let { 
    contentTextView?.apply { 
     visibility = View.VISIBLE 
     text = contentText 
    } 
} 

titleText?.let { 
    titleTextView?.apply { 
     visibility = View.VISIBLE 
     text = titleText 
    } 
} 

Voici ma fonction

private fun setTextAndVisiblity(textView: TextView?, newText: String?): TextView? { 
    return textView?.apply { 
     visibility = View.VISIBLE 
     text = newText 
    } 
} 

Ceci est mon code lorsque la fonction applique

contentText?.let { 
    setVisibleText(contentTextView, it) 
} 

titleText?.let { 
    setVisibleText(titleTextView, it) 
} 
+1

Votre fonction d'extension doit recevoir contextText comme paramètre si vous ne le déclarez pas comme local (je ne le vois pas, parce que le mot-clé private). Et puis la déclaration doit être appelée comme 'theTextView.setVisibleText (theText)' – crgarridos

+0

Bon point, merci. Cependant, je l'ai déclaré comme local. – UmAnusorn

Répondre

2

Je voudrais écrire la fonction d'extension comme ceci:

fun TextView.setVisibleIfTextNotNull(text: CharSequence?) = text?.let { 
    visibility = View.VISIBLE 
    this.text = it 
} 

Utilisation:

contentTextView?.setVisibleIfTextNotNull(contentText) 
titleTextView?.setVisibleIfTextNotNull(titleText) 

Vous pouvez faire comme une fonction imbriquée ou une fonction d'extension privée comme vous le souhaitez. Le nom de la fonction peut ne pas être assez clair pour clarifier ce que la fonction fait, vous pouvez penser à un meilleur.

+0

Pourquoi utilisez-vous CharSequence au lieu de String? – UmAnusorn

+1

@umitems Parce que le type 'text' de' Text'' est 'CharSequence'. Avec 'CharSequence', vous pouvez utiliser [' SpannableString'] (https://developer.android.com/reference/android/text/SpannableString.html) pour créer du texte stylé. – BakaWaii

1

Une fonction d'extension semble être le meilleur choix. Si vous faites la fonction retourner this vous pouvez l'utiliser sans appliquer.

Votre autre choix serait de créer une fonction ordinaire et de la passer en also en utilisant des références de méthode, par ex.

fun setVisibleText(view: View) { } 
titleTextView.also(this::setVisibleText) 
1

la plus propre pour moi est de déclarer une fonction d'extension comme:

fun TextView.setVisibleWithText(text: String?){ 
    text ?: return 
    visibility = View.VISIBLE 
    setText(text) 
} 

puis l'appeler comme:

myTextView?.setVisibleWithText(myText) 

Quoi qu'il en soit, rappelez-vous une fonction d'extension juste une statique util fonction. Cette fonction ci-dessous:

fun TextView.setVisibleWithText(text: String){ 
    visibility = View.VISIBLE 
    setText(text) 
} 

deuiendront quelque chose comme ça en java:

class TextViewKt { 
    public static function setVisibleWithText(@NotNull TextView receiver, @NotNull String text){ 
    receiver.visibility = View.VISIBLE 
    receiver.setText(text) 
    } 
} 

Et après, vous pouvez l'appeler comme:

theText?.let { theTextView?.setVisibleWithText(it) } 

Vous pouvez toujours déclarer une funtion normale :

fun setVisibleWithText(textView: TextView, text: String){ 
     textView.visibility = View.VISIBLE 
     textView.text = text 
    } 

ou si vous voulez faire le chèque à l'intérieur:

/*** 
    * It makes the textview visible if text is not null (it will stay visible if it was visible before) 
    **/ 
    fun setVisibleWithText(textView: TextView, text: String?){ 
     text ?: return 
     textView.visibility = View.VISIBLE 
     textView.text = text 
    }