¿Cómo agrupar la statement duplicada en .aplicar en Kotlin?

Aquí está mi código. Como puede ver, el cuerpo de aplicar es exactamente el mismo. ¿Hay una function de extensión mejor que usar?

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

Aquí está mi function

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

Este es mi código cuando se aplica la function

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

Escribiría la function de extensión así:

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

Uso:

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

Puede hacerlo como una function anidada o una function de extensión privada que desee. El nombre de la function puede no ser lo suficientemente claro como para aclarar qué hace la function, puede pensar en una mejor.

Una function de extensión parece ser la mejor opción. Si hace que la function devuelva this , puede usarlo sin aplicar.

Su otra opción sería crear una function ordinaria y pasarla also utilizando references de methods, por ej.

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

el más limpio para mí es declarar una function de extensión como:

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

luego llamándolo así:

 myTextView?.setVisibleWithText(myText) 

De todos modos, recuerde que una extensión funciona solo como una function de utilidad estática. Esta function a continuación:

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

Se convertirá en algo como esto en java:

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

Y después de que pueda llamarlo así:

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

Siempre puede declarar una function normal como:

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

o si desea hacer el control dentro:

  /*** * 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 } 
  • Anko - Configuración del valor de fila y columna para un elemento en gridLayout
  • ¿Cómo se traduce esta syntax maravillosa a kotlin?
  • No se esperan arguments de tipo para la diversión findViewById (p0: Int): Ver
  • getActionView está en desuso?
  • Cómo volver a vincular al service de reproductor de música bind ya en ejecución
  • ¿Cómo llamar al método ArrayAdapter.addAll en Kotlin?
  • Nueva architecture con Dagger y Kotlin
  • Obteniendo respuesta HTML / JSON original por error con Retrofit 2 y Kotlin
  • Construir un contenedor autoejecutable con Gradle y Kotlin
  • ¿Se considera idiomático preferir siempre las properties sobre los campos de respaldo?
  • ¿Cómo puedo dividir la secuencia del número integer en ranges (java \ kotlin)