Как новый ViewBinding сравнивается с Android-расширениями Kotlin с синтетическими привязками видов?
Кроме форм NullSafety и TypeSafety, предоставляемых новыми ViewBindings, почему бы нам не рассмотреть вариант использования Kotlin использования синтетических привязок в Views.
Является ли новый ViewBinding более производительным, так как он генерирует класс Binding заранее?
Ответы:
Давайте рассмотрим два.
конфигурация
Расширения Kotlin для Android
import kotlinx.android.synthetic.main.<layout>.*
textView.text = "Hello, world!"
. Эти расширения работают на:Activities
,Fragments
иViews
.Просмотр привязки
private lateinit var binding YourClassBinding
binding = YourClassBinding.inflate(layoutInflater)
внутриActivity
«sonCreate
и вызовsetContentView(binding.root)
, или раздуть его вFragment
» ыonCreateView
затем вернуть его:return binding.root
binding.textView.text = "Hello, world!"
Тип безопасности
Расширения Kotlin Android и ViewBinding по определению безопасны по типу, поскольку ссылочные представления уже приведены к соответствующим типам.
Нулевая безопасность
Расширения Kotlin для Android и ViewBinding абсолютно безопасны. ViewBinding здесь не имеет никаких преимуществ . В случае KAE , если представление присутствует только в некоторых конфигурациях компоновки, IDE укажет вам это:
Таким образом, вы просто рассматриваете его как любой другой обнуляемый тип в Kotlin, и ошибка исчезнет:
Применение изменений макета
В случае расширений Kotlin Android изменения макета мгновенно преобразуются в создание синтетических расширений, поэтому вы можете использовать их сразу. В случае ViewBinding , вы должны построить свой проект
Неверное использование макета
В случае Kotlin Android Extensions , можно импортировать неправильные макеты синтетических расширений, тем самым вызывая
NullPointerException
. То же самое относится и к ViewBinding , поскольку мы можем импортировать неправильныйBinding
класс. Хотя более вероятно пропустить неверный импорт, чем неправильное имя класса, особенно если файл макета имеет правильное имя послеActivity
/Fragment
/View
, поэтому ViewBinding имеет преимущество .Резюме KAE против ViewBinding
Я думаю, что существует большое заблуждение о том, что ViewBinding является заменой для KAE . Люди слышат большие ключевые слова и повторяют их без предварительной проверки. Конечно, ViewBinding сейчас является лучшим вариантом для разработки Java (замена ButterKnife ), но в Kotlin нет или мало преимуществ по сравнению с KAE (см. Раздел « Неправильное использование макета »).
Примечание: я уверен, что пользователям DataBinding понравится ViewBinding :)
источник
DataBinding
? Я думаю, что это важная особенность - вообще не использовать ссылки на представления. Кстати, вы можете «бросить» модель представления через<include ... />
теги, что является еще одним большим преимуществом.ViewBinding
решил самую большую проблемуkotlinx.android.synthetic
. Вsynthetic
связывании, если вы задаете представление содержимого для макета, а затем введите идентификатор, который существует только в другом макете, среда IDE позволяет выполнять автозаполнение и добавлять новый оператор импорта. Если разработчик не проверит, чтобы убедиться, что его операторы импорта импортируют только правильные представления, нет безопасного способа убедиться, что это не вызовет проблем во время выполнения. НоViewBinding
вы должны использовать свойlayout
объект привязки для доступа к его представлениям, чтобы вы никогда не вызывали представление в другом макете, и если вы захотите это сделать, вы получите ошибку компиляции, а не ошибку времени выполнения. Вот пример.Мы создаем две раскладки , называемые
activity_main
иactivity_other
как так:Теперь, если вы напишите свою деятельность так:
Ваш код будет скомпилирован без каких-либо ошибок, но ваше приложение потерпит крах во время выполнения. Потому что представление с
message_other
идентификатором не существует,activity_main
и компилятор не проверял это. Но если вы используетеViewBinding
так:ваш код никогда не скомпилируется и
Android Studio
покажет вам ошибку в последней строке.источник
kotlinx.android.synthetic больше не является рекомендуемой практикой, говорится в сообщении Google в одном сообщении о коммите "одна из веток Reddit
https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "
Синтетика не разработана Google, она является частью расширения kotlin android, созданного JetBrains, и постепенно разработчики google android начали заменять Synthetics на ViewBindins в своих демоверсиях и исходных кодах.
«Теперь возникает вопрос, какой из них мы должны принять это во внимание».
Согласно Google (Просмотр связывания, ButterKnife, Kotlin synthetics) эти библиотеки успешно используются многими приложениями и решают одну и ту же проблему.
Но для большинства приложений Google рекомендует попробовать привязку представлений вместо этих библиотек, поскольку привязка представлений обеспечивает более безопасный и краткий просмотр представлений.
Прикрепленное контрольное изображение, чтобы быстро очистить вещи.
Однако, если вы хотите пойти в отдел, вы можете перейти по приведенной ниже ссылке. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
источник
or after view lifecycle ends
часть?apply plugin: 'kotlin-android-extensions'
противviewBinding { enabled = true }
. Не большая разница.