16 consejos de desarrollo para Android en Kotlin. Parte 3

Hola de nuevo En previsi贸n del lanzamiento del curso b谩sico sobre desarrollo de Android , compartimos la parte final del art铆culo "16 consejos de desarrollo para Android en el idioma Kotlin".




Lee la primera parte
Lee la segunda parte

LATEINIT


Una de las caracter铆sticas principales de Kotlin es su compromiso con la seguridad cero. La declaraci贸n de lateinit proporciona una manera f谩cil de garantizar cero seguridad e inicializar la variable seg煤n lo requiera Android. Esta caracter铆stica es excelente, sin embargo, debe acostumbrarse despu茅s de trabajar en Java. Una idea es que el campo se declare inmediatamente con la capacidad de ser nulo:

var total = 0 var toolbar: Toolbar? = null 


Esta funci贸n de lenguaje puede causar dificultades al trabajar con dise帽os de Android, porque no sabemos c贸mo declarar vistas antes de declarar el dise帽o, porque no est谩 claro d贸nde existir谩n en Activity o Fragment . Esto se compensa con pruebas adicionales para la posibilidad de un valor cero en cada lugar con el que interactuamos, pero este sigue siendo hemorroides. Por lo tanto, es mejor usar el modificador lateinit :

 lateinit var toolbar: Toolbar 

Ahora, como desarrollador, no debe consultar la Barra de herramientas hasta que se haya inicializado. Esto funciona muy bien cuando se usa junto con una biblioteca como Butter Knife :

 @BindView(R.id.toolbar) lateinit var toolbar: Toolbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ButterKnife.bind(this) //       toolbar toolbar.setTitle("Hello There") } 

Tipo de seguridad


Algunas convenciones de Android requieren una escritura segura porque la escritura regular no excluye errores de c贸digo. Por ejemplo, una forma t铆pica de crear un fragmento en acci贸n implica verificar a trav茅s del FragmentManager para asegurarse de que ya existe. Y solo si no es as铆, lo crea y lo agrega a la acci贸n. Cuando veas c贸mo escribir en Kotlin por primera vez, puedes implementar esto de la siguiente manera:

 var feedFragment: FeedFragment? = supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as FeedFragment      .  as     ,     .   : var feedFragment: FeedFragment? = supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as? FeedFragment if (feedFragment == null) { feedFragment = FeedFragment.newInstance() supportFragmentManager.beginTransaction() .replace(R.id.root_fragment, feedFragment, TAG_FEED_FRAGMENT) .commit() } 

APROVECHAMIENTO


Aprovechar let le permite ejecutar un bloque si el valor del objeto no es cero. Esto le permite evitar verificaciones nulas y hace que el c贸digo sea m谩s legible. En Java, se ve as铆:

 if (currentUser != null) { text.setText(currentUser.name) }   Kotlin   : user?.let { println(it.name) } 

Este c贸digo es mucho m谩s legible, adem谩s crea autom谩ticamente una variable con un valor distinto de cero sin el riesgo de ponerlo a cero.

SNULLOREMPTY | ISNULLORBLANK


Tenemos que verificar los campos muchas veces durante el desarrollo de la aplicaci贸n de Android. Si logr贸 esto sin usar Kotlin, probablemente conozca la clase TextUtils en Android. La clase TextUtils es la siguiente:

 if (TextUtils.isEmpty(name)) { //    } 

En este ejemplo, notar谩 que el usuario puede establecer incluso solo espacios como nombre de usuario, y pasar谩 la prueba. isNullOrEmpty e isNullOrBlank est谩n integrados en el lenguaje Kotlin, eliminan la necesidad de TextUtils.isEmpty ( someString ) y brindan el beneficio adicional de verificar solo espacios. Si es necesario, puede usar algo como esto:

 //       ... if (number.isNullOrEmpty()) { //     } //  ... if (name.isNullOrBlank()) { //     } 

La comprobaci贸n de la correcci贸n de completar los campos a menudo se encuentra cuando el registro es necesario en la aplicaci贸n. Estos m茅todos integrados son excelentes para verificar el campo y alertar al usuario si algo est谩 mal. Para verificaciones m谩s complejas, puede usar m茅todos de extensi贸n, por ejemplo, para direcciones de correo electr贸nico:

 fun TextInputLayout.isValidForEmail(): Boolean { val input = editText?.text.toString() if (input.isNullOrBlank()) { error = resources.getString(R.string.required) return false } else if (emailPattern.matcher(input).matches()) { error = resources.getString(R.string.invalid_email) return false } else { error = null return true } } 

Consejos para el avanzado


驴Sab铆a que puede usar expresiones lambda para crear c贸digo m谩s limpio y conciso?

Por ejemplo, cuando se trabaja en Java, es t铆pico tener una clase de escucha simple, como:

 public interface OnClickListener { void onClick(View v); } 

Una caracter铆stica distintiva de Kotlin es que realiza conversiones SAM (M茅todo abstracto 煤nico) para clases Java. Un escucha de clics en Java que se parece a:

 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // -  } });  Kotlin     : textView.setOnClickListener { view -> // -  } 

Por extra帽o que parezca, tal conversi贸n no es posible para las interfaces SAM creadas en Kotlin. Esto puede sorprender e incluso decepcionar un poco a los nuevos usuarios de Kotlin. Si se definiera la misma interfaz en Kotlin, el oyente se ver铆a as铆:

 view.setOnClickListener(object : OnClickListener { override fun onClick(v: View?) { // -  } }) 

Para acortar dicho c贸digo, puede escribir a sus oyentes en la clase de la siguiente manera:

 private var onClickListener: ((View) -> Unit)? = null fun setOnClickListener(listener: (view: View) -> Unit) { onClickListener = listener } //     onClickListener?.invoke(this) 

Esto lo devolver谩 a una sintaxis lambda simple que hace posible la conversi贸n autom谩tica de SAM.

Conclusi贸n


Recopil茅 los trucos de vida m谩s 煤tiles de todo lo que he aprendido desde que me interes茅 en el idioma Kotlin. Espero que el conocimiento de estos consejos lo ayude significativamente a desarrollar sus propios proyectos.

Eso es todo. 隆Nos vemos en el curso !

Source: https://habr.com/ru/post/481010/


All Articles