¿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 } 
  • Cómo configurarOnItemClickListener para Vista de list con adaptador personalizado por Kotlin
  • Interoperabilidad de Java: aplique @JvmName a los buscadores de properties en la class de interfaz o abstracta
  • Comparta un module de Kotlin con un proyecto de Android y de escritorio
  • ¿Cómo convierto un Char a Int?
  • Forma correcta de get properties con la configuration de Kotlin-script para Gradle
  • java https: // localhost (SSL) - posible sin instalar certs en el cliente?
  • ¿Cómo funciona la syntax de acceso a la propiedad de Kotlin para las classs de Java (es decir, EditText setText)?
  • Configurando Jetty con SSL / TLS y Keystore
  • ¿Por qué kotlin tiene funciones componentN en la class de datos, si ya tienen getters y setters?
  • Dependencias faltantes o conflictivas para Anko floatingActionButton
  • Kotlin no puede inferir el tipo cuando utiliza la reference de método en Flowable