¿Cómo se compara el nuevo ViewBinding con las extensiones de Android Kotlin con enlaces de vistas sintéticas?
Además de NullSafety y TypeSafety proporcionadas por los nuevos ViewBindings, ¿por qué deberíamos considerar abandonar la forma de Kotlin de usar enlaces sintéticos en las Vistas?
¿El nuevo ViewBinding tiene más rendimiento ya que genera la clase Binding de antemano?
Respuestas:
Repasemos los dos.
Configuración
Extensiones de Android Kotlin
import kotlinx.android.synthetic.main.<layout>.*
textView.text = "Hello, world!"
. Estas extensiones funcionan en:Activities
,Fragments
yViews
.Ver enlace
private lateinit var binding YourClassBinding
binding = YourClassBinding.inflate(layoutInflater)
en el interiorActivity
'sonCreate
y llamadasetContentView(binding.root)
, o inflarlo enFragment
' sonCreateView
luego devolverlo:return binding.root
binding.textView.text = "Hello, world!"
Tipo de seguridad
Kotlin Android Extensions y ViewBinding son seguros para los tipos por definición, porque las vistas referenciadas ya están convertidas en tipos apropiados.
Seguridad nula
Kotlin Android Extensions y ViewBinding son nulos seguros. ViewBinding no tiene ninguna ventaja aquí . En el caso de KAE , si la vista está presente solo en algunas configuraciones de diseño, IDE lo señalará por usted:
Así que solo lo trata como cualquier otro tipo anulable en Kotlin, y el error desaparecerá:
Aplicar cambios de diseño
En el caso de las extensiones de Android Kotlin , los cambios de diseño se traducen instantáneamente en la generación de extensiones sintéticas, por lo que puede usarlas de inmediato. En el caso de ViewBinding , debe construir su proyecto
Uso incorrecto del diseño
En el caso de las extensiones de Android Kotlin , es posible importar extensiones sintéticas de diseño incorrecto, causando así
NullPointerException
. Lo mismo se aplica a ViewBinding , ya que podemos importar unaBinding
clase incorrecta . Aunque, es más probable que pase por alto la importación incorrecta que el nombre de clase incorrecto, especialmente si el archivo de diseño está bien nombrado después deActivity
/Fragment
/View
, por lo que ViewBinding tiene ventaja aquí.Resumen de KAE vs ViewBinding
Creo que hay una gran idea errónea acerca de que ViewBinding es un reemplazo para KAE . La gente escucha palabras clave grandes y las repite sin verificarlas de antemano. Claro, ViewBinding es la mejor opción para el desarrollo de Java en este momento (reemplazo de ButterKnife ), pero no hay o poca ventaja sobre KAE en Kotlin (consulte la sección Uso de diseño incorrecto ).
Nota al margen: estoy seguro de que a la gente de DataBinding le gustará ViewBinding :)
fuente
DataBinding
? Creo que es una característica esencial dejar de usar referencias de vista. Por cierto, puede "lanzar" su modelo de vista a través de<include ... />
etiquetas, que es otra gran ventaja.ViewBinding
resuelto el mayor problema dekotlinx.android.synthetic
. En elsynthetic
enlace, si configura su vista de contenido en un diseño, luego escribe una identificación que solo existe en un diseño diferente, el IDE le permite completar automáticamente y agregar la nueva declaración de importación. A menos que el desarrollador verifique específicamente para asegurarse de que sus declaraciones de importación solo importen las vistas correctas, no hay una forma segura de verificar que esto no cause un problema de tiempo de ejecución. PeroViewBinding
debe usar sulayout
objeto de enlace para acceder a sus vistas para que nunca invoque a una vista en un diseño diferente y, si desea hacerlo, obtendrá un error de compilación, no un error de tiempo de ejecución. Aquí hay un ejemplo.Creamos dos diseños llamados
activity_main
yactivity_other
así:Ahora si escribes tu actividad así:
su código se compilará sin ningún error, pero su aplicación se bloqueará en tiempo de ejecución. Debido a que la vista con
message_other
id no existeactivity_main
y el compilador no verificó esto. Pero si usasViewBinding
así:su código nunca se compilará y le
Android Studio
mostrará un error en la última línea.fuente
kotlinx.android.synthetic ya no es una práctica recomendada, dijo Google en un mensaje de confirmación "uno de los hilos de Reddit
https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "
Synthetics no está desarrollado por google, es parte de la extensión de Android kotlin creada por JetBrains y gradualmente los desarrolladores de google android comenzaron a reemplazar Synthetics por ViewBindins en sus demos y códigos fuente.
"Ahora viene la pregunta, cuál debemos tener en cuenta".
Según google (View vinculante, ButterKnife, Kotlin sintéticos), muchas bibliotecas utilizan con éxito estas bibliotecas y resuelven el mismo problema.
Pero para la mayoría de las aplicaciones, Google recomienda probar el enlace de vista en lugar de estas bibliotecas, ya que el enlace de vista proporciona una búsqueda de vista más segura y concisa.
Imagen de referencia adjunta para aclarar las cosas rápidamente.
Sin embargo, si desea ir al departamento, puede seguir el siguiente enlace. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
fuente
or after view lifecycle ends
parte?apply plugin: 'kotlin-android-extensions'
vsviewBinding { enabled = true }
. No mucha diferencia.