Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Android KTX - Mejor código gracias a Kotlin

Android KTX - Mejor código gracias a Kotlin

Kotlin Everywhere Buenos Aires
https://www.youtube.com/watch?v=Fo0NclqNOHY

Avatar for Maribel Maisano

Maribel Maisano

October 05, 2019
Tweet

More Decks by Maribel Maisano

Other Decks in Programming

Transcript

  1. Antes de empezar • Esta no es una charla limitada

    a Android • Esta charla es sobre: ◦ Diseño de software. ◦ Features modernos de Kotlin. ◦ Refactoring.
  2. Android + Java ❤ • Primer release del SDK: Octubre

    de 2009 • Muy buenos motivos para que decidir que las apps Android se hagan en Java. • ¿Qué pasa con las decisiones de diseño que tomamos hace 10 años?
  3. Mirando 10 años hacia atrás • Las decisiones ya tomadas

    son difíciles de cambiar. • El SDK de Android está fuertemente basado en el concepto de herencia. • Reemplazo de componentes del SDK por librerías. • Retrocompatibilidad. • ¿Y los métodos ya existentes?
  4. Kotlin • Con soporte oficial para el desarrollo Android desde

    Mayo de 2017. • Incluye features nativos del lenguaje que permiten lidiar mejor con esta necesidad de refactor del SDK.
  5. Android KTX • Conjunto de extensiones para Android. • Simplifica

    las APIs originales y logra un código Kotlin más idiomático. • Se distribuye en distintas librerías, organizadas por módulos: ◦ Core KTX. ◦ Fragment KTX. ◦ SQLite KTX. ◦ Collection KTX. ◦ ...
  6. Extension functions / properties • Permiten agregar funciones o atributos

    a una clase sin tener que modificarla. ◦ Evita la herencia. ◦ No es necesario tener acceso al código fuente de la clase que se va a extender. • Las funciones que se agregan se usan de la misma forma que cualquier otra función de la clase.
  7. Extension functions / properties inline var View.isVisible: Boolean get() =

    visibility == View.VISIBLE set(value) { visibility = if (value) View.VISIBLE else View.GONE }
  8. Top-level functions • Se definen funciones dentro de un archivo

    .kt que pueden ser usadas desde cualquier parte del proyecto ◦ Su visibilidad es acorde al modificador de acceso. ◦ Es necesario importar la función que se quiera usar.
  9. Top-level functions val bundle = Bundle() bundle.putString("fileName", "logo") bundle.putBoolean("isImage", true)

    bundle.putInt("size", 19) ⬇ val bundle = bundleOf("fileName" to "logo", "isImage" to true, "size" to 19)
  10. Top-level functions fun bundleOf(vararg pairs: Pair<String, Any?>) = Bundle(pairs.size).apply {

    for ((key, value) in pairs) { when (value) { null -> putString(key, null) // Any nullable type will suffice. // Scalars is Boolean -> putBoolean(key, value) is Byte -> putByte(key, value) … …
  11. Named arguments • Útiles para aquellas funciones que reciben muchos

    parámetros y es difícil recordar el orden de los mismos. • Mismo problema cuando los parámetros son del mismo tipo. • Agregan claridad y legibilidad al poder llamar a cada parámetro por su nombre.
  12. Named arguments inline fun View.updatePadding( @Px left: Int = paddingLeft,

    @Px top: Int = paddingTop, @Px right: Int = paddingRight, @Px bottom: Int = paddingBottom ) { setPadding(left, top, right, bottom) }
  13. Default arguments • Útiles cuando un parámetro puede ser opcional.

    • Ayudan a minimizar el uso de sobrecarga de una función.
  14. Default arguments aView.setPadding(aView.paddingLeft, aView.paddingTop, 32, aView.paddingBottom) ⬇ aView.updatePadding(right = 32)

    aView.setPadding(aView.paddingLeft, 16, aView.paddingRight, 16) ⬇ aView.updatePadding(bottom = 16, top = 16)
  15. Default arguments fun Drawable.toBitmap( @Px width: Int = intrinsicWidth, @Px

    height: Int = intrinsicHeight, config: Config? = null ): Bitmap { ... }
  16. Lambdas • Funciones que pueden usarse como literales, es decir,

    pasarse como parámetro, asignar a una variable, etc. • Útiles cuando se quiere mandar una callback como parámetro. • También son útiles cuando siempre es necesaria una inicialización y finalización antes de realizar una tarea.
  17. Android KTX • Fragment transaction supportFragmentManager .beginTransaction() .replace(R.id.container, aFragment, AFragment.TAG)

    .commit() ⬇ supportFragmentManager.commit { replace(R.id.container, aFragment, AFragment.TAG) }
  18. Enlaces útiles • Android Jetpack: sweetening Kotlin development with Android

    KTX (Google I/O '18) https://www.youtube.com/watch?v=st1XVfkDWqk&t=9s • Android KTX https://developer.android.com/kotlin/ktx.html?hl=es • Código fuente https://github.com/android/android-ktx