Comment le nouveau ViewBinding se compare-t-il aux extensions Android Kotlin avec des liaisons de vues synthétiques?
Outre la NullSafety et la TypeSafety fournies par les nouveaux ViewBindings, pourquoi devrions-nous envisager d'abandonner la manière Kotlin d'utiliser des liaisons synthétiques sur les vues.
Le nouveau ViewBinding est-il plus performant car il génère au préalable la classe Binding?
Réponses:
Passons en revue les deux.
Configuration
Extensions Android Kotlin
import kotlinx.android.synthetic.main.<layout>.*
textView.text = "Hello, world!"
. Ces extensions fonctionnent sur:Activities
,Fragments
etViews
.Voir la reliure
private lateinit var binding YourClassBinding
binding = YourClassBinding.inflate(layoutInflater)
dansActivity
« sonCreate
et un appelsetContentView(binding.root)
, ou le gonfler dansFragment
l »onCreateView
retour il:return binding.root
binding.textView.text = "Hello, world!"
Type de sécurité
Les extensions Android Kotlin et ViewBinding sont sécuritaires par définition, car les vues référencées sont déjà converties en types appropriés.
Sécurité nulle
Les extensions Kotlin Android et ViewBinding sont toutes deux sans danger. ViewBinding n'a aucun avantage ici . Dans le cas de KAE , si la vue n'est présente que dans certaines configurations de mise en page, IDE vous le signalera:
Donc, vous le traitez simplement comme n'importe quel autre type nullable dans Kotlin, et l'erreur disparaîtra:
Application des modifications de disposition
Dans le cas des extensions Kotlin Android , les changements de disposition se traduisent instantanément par la génération d'extensions synthétiques, vous pouvez donc les utiliser immédiatement. En cas de ViewBinding , vous devez construire votre projet
Utilisation incorrecte de la mise en page
En cas d' extensions Kotlin Android , il est possible d'importer des extensions synthétiques de mise en page incorrectes, provoquant ainsi
NullPointerException
. La même chose s'applique à ViewBinding , car nous pouvons importer une mauvaiseBinding
classe. Bien qu'il soit plus probable d'oublier l'importation incorrecte que le nom de classe incorrect, surtout si le fichier de mise en page porte bien le nom deActivity
/Fragment
/View
, ViewBinding a donc le dessus ici.Résumé de KAE vs ViewBinding
Je pense qu'il y a une grande idée fausse sur le fait que ViewBinding remplace KAE . Les gens entendent de gros mots clés et les répètent sans les vérifier au préalable. Bien sûr, ViewBinding est la meilleure option pour le développement Java en ce moment (remplacement de ButterKnife ), mais il n'y a pas ou peu d'avantages sur KAE dans Kotlin (voir la section Utilisation incorrecte de la mise en page ).
Note latérale: je suis sûr que les utilisateurs de DataBinding apprécieront ViewBinding :)
la source
DataBinding
? Je pense que c'est une fonctionnalité essentielle pour ne plus utiliser de références de vue. Soit dit en passant, vous pouvez "lancer" votre modèle de vue à travers des<include ... />
balises, ce qui est un autre gros avantage.ViewBinding
résolu le plus gros problème dekotlinx.android.synthetic
. Dans lasynthetic
liaison si vous définissez votre vue de contenu sur une mise en page, puis tapez un identifiant qui n'existe que dans une autre mise en page, l'EDI vous permet de compléter automatiquement et d'ajouter la nouvelle instruction d'importation. Sauf si le développeur vérifie spécifiquement que ses instructions d'importation importent uniquement les vues correctes, il n'existe aucun moyen sûr de vérifier que cela ne causera pas de problème d'exécution. MaisViewBinding
vous devez utiliser votrelayout
objet de liaison pour accéder à ses vues afin de ne jamais invoquer une vue dans une disposition différente et si vous voulez le faire, vous obtiendrez une erreur de compilation et non une erreur d'exécution. Voici un exemple.Nous créons deux mises en page appelées
activity_main
etactivity_other
ainsi:Maintenant, si vous écrivez votre activité comme ceci:
votre code se compilera sans aucune erreur mais votre application se bloquera lors de l'exécution. Parce que la vue avec
message_other
id n'existe pasactivity_main
et que le compilateur n'a pas vérifié cela. Mais si vous utilisezViewBinding
comme ça:votre code ne sera jamais compilé et
Android Studio
vous montrera une erreur dans la dernière ligne.la source
kotlinx.android.synthetic n'est plus une pratique recommandée, a déclaré par google dans un message de validation "l'un des threads Reddit
https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "
Synthetics n'est pas développé par google, il fait partie de l'extension android kotlin conçue par JetBrains et les développeurs de google android ont progressivement commencé à remplacer les synthétiques par les ViewBindins dans leurs démos et codes sources.
"Maintenant vient la question, laquelle nous devons prendre en considération."
Selon google (View binding, ButterKnife, Kotlin synthetics), ces bibliothèques sont utilisées avec succès par de nombreuses applications et résolvent le même problème.
Mais pour la plupart des applications, Google recommande d'essayer la liaison de vues au lieu de ces bibliothèques, car la liaison de vues offre une recherche de vue plus sûre et plus concise.
Image de référence jointe pour effacer les choses rapidement.
Cependant, si vous souhaitez vous rendre dans le département, vous pouvez suivre le lien ci-dessous. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
la source
or after view lifecycle ends
partie?apply plugin: 'kotlin-android-extensions'
vsviewBinding { enabled = true }
. Pas beaucoup de différence.