Las extensiones de Android de Kotlin están obsoletas. ¿Qué hacer? Instrucciones de migración

Es posible que ya haya escuchado que el complemento Kotlin Android Extensions para Kotlin ahora está obsoleto.

kotlinx.android.synthetic ya no es una práctica recomendada. Eliminando a favor de findViewById explícito


Por supuesto, esto fue muy conveniente, especialmente si tiene un proyecto completamente en Kotlin. Sin embargo, el mundo está cambiando y ahora debemos buscar alternativas. En este artículo, veremos rápidamente qué es el complemento de extensión de Android de Kotlin, cuáles fueron los problemas con él y qué deberíamos hacer ahora, los desarrolladores de Android. En parte, se utilizó el material de este artículo . Entonces vamos.



Extensiones de Android Kotlin de un vistazo



Kotlin Android Extensions es un complemento de Kotlin que le permite restaurar vistas de Actividades, Fragmentos y Vistas sin escribir código estándar como findViewById.

El complemento genera código adicional que le permite acceder a la vista como XML, como si estuviera tratando con las propiedades llamadas id que utilizó al definir la estructura.



También crea un caché de vista local. La primera vez que utilice la propiedad, el complemento ejecutará el findViewById predeterminado. Posteriormente, la vista se restaurará desde la caché, por lo que el acceso a ella será más rápido.



Si todo es tan conveniente, ¿por qué desaprobarlo?



Problemas con las extensiones de Android de Kotlin



  • . , view — , id.
  • Kotlin ()
  • Null Safety. , view — , .
  • . : UI Kit, UI-, . issues . findViewById :(
  • , , — , , . — Kotlin Android Extensions .




  • KotterKnife (, ).
  • FindViewById() — , .
  • AndroidAnnotations ( 2015)
  • View Binding Google — !


View Binding Google



Entonces, el ganador en esta lista es ViewBinding de Google (que no debe confundirse con DataBinding). Echemos un vistazo rápido a lo que es.



View Binding es una herramienta que facilita la escritura de código para interactuar con una vista. Cuando habilita el enlace de vista en un módulo específico, genera clases de enlace para cada archivo de diseño en el módulo. El objeto de la clase de vinculación generada contiene enlaces a todas las vistas del archivo de marcado para el que se especifica android: id.



Las principales ventajas de la vinculación de vistas son la seguridad nula y la seguridad de tipos.



Introducción a la vinculación de vistas



Comenzar con ViewBinding es bastante fácil. Necesita agregar una opción para build.gradle:



android {
    ...
    buildFeatures {
        viewBinding true
    }
}


Después de eso, ya puedes usarlo. Cada clase de enlace generada contiene un enlace a la vista raíz del marcado (raíz) y enlaces a todas las vistas que tienen id. El nombre de la clase generada se forma como "nombre de archivo de marcado", traducido en caso de camello + "Enlace". Por ejemplo, para el archivo de marcado result_profile.xml:



<LinearLayout ... >
    <TextView android:id="@+id/name" />
    <ImageView android:cropToPadding="true" />
    <Button android:id="@+id/button"
        android:background="@drawable/rounded_button" />
</LinearLayout>


Se generará una clase ResultProfileBinding que contiene 2 campos: nombre de TextView y botón de botón.



Usar en actividad



Por ejemplo, tienes este diseño:



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>


El resultado de ViewBinding:



public final class ActivityMainBinding implements ViewBinding {
  @NonNull
  private final ConstraintLayout rootView;

  @NonNull
  public final TextView textView;


Puede usar viewBinding así:



private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}


Y ahora, después de obtener los enlaces a la vista:



binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }


Si está utilizando ViewBinding en un fragmento y mantiene el enlace al enlace en el fragmento (y no solo en el método onCreateView ()), no olvide borrar los enlaces en el método onDestroyView ().



Ejemplo:



private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}


Esto debe hacerse debido al fragmento y al ciclo de vida de la vista:



imagen



en general, cambiar a ViewBinding no es lo suficientemente difícil, aunque es una pena que las extensiones de Android de Kotlin estén obsoletas. No olvide unirse a nosotros en Telegram , y en la plataforma AndroidSchool.ru se publican materiales útiles para desarrolladores de Android y tutoriales modernos.



Enlaces útiles:






All Articles