Jak nowe ViewBinding ma się do rozszerzeń Kotlin dla Androida z syntetycznymi wiązaniami widoków?
Oprócz NullSafety i TypeSafety zapewnianych przez nowe ViewBindings, dlaczego warto rozważyć porzucenie Kotlinowskiego sposobu korzystania z syntetycznych powiązań w widokach.
Czy nowy ViewBinding jest bardziej wydajny, ponieważ wcześniej generuje klasę Binding?
Odpowiedzi:
Przyjrzyjmy się dwóm.
Konfiguracja
Rozszerzenia Kotlin dla Androida
import kotlinx.android.synthetic.main.<layout>.*
textView.text = "Hello, world!"
. Rozszerzenia te działają na:Activities
,Fragments
iViews
.Zobacz wiązanie
private lateinit var binding YourClassBinding
binding = YourClassBinding.inflate(layoutInflater)
wnętrzeActivity
„yonCreate
i połączeniasetContentView(binding.root)
, czy napompować go wFragment
” sonCreateView
następnie powrócić go:return binding.root
binding.textView.text = "Hello, world!"
Wpisz bezpieczeństwo
Rozszerzenia Kotlin dla systemu Android i ViewBinding są z definicji bezpieczne dla typów, ponieważ widoki odniesienia są już rzutowane na odpowiednie typy.
Brak bezpieczeństwa
Rozszerzenia Kotlin dla Androida i ViewBinding są bezpieczne. ViewBinding nie ma tu żadnej przewagi . W przypadku KAE , jeśli widok jest obecny tylko w niektórych konfiguracjach układu, IDE zwróci na to uwagę:
Więc traktujesz go jak każdy inny dopuszczający się do null typ w Kotlinie, a błąd zniknie:
Stosowanie zmian układu
W przypadku rozszerzeń Kotlin dla systemu Android zmiany układu natychmiast przekładają się na generowanie rozszerzeń syntetycznych, dzięki czemu można od razu z nich korzystać. W przypadku ViewBinding musisz zbudować swój projekt
Niepoprawne użycie układu
W przypadku rozszerzeń Kotlin dla systemu Android możliwe jest importowanie nieprawidłowych rozszerzeń układu, co powoduje
NullPointerException
. To samo dotyczy ViewBinding , ponieważ możemy zaimportować niewłaściwąBinding
klasę. Chociaż bardziej prawdopodobne jest przeoczenie niewłaściwego importu niż niepoprawnej nazwy klasy, szczególnie jeśli plik układu jest dobrze nazwany poActivity
/Fragment
/View
, więc ViewBinding ma tutaj przewagę.Podsumowanie KAE vs ViewBinding
Myślę, że istnieje duże nieporozumienie, że ViewBinding zastępuje KAE . Ludzie słyszą duże słowa kluczowe i powtarzają je bez uprzedniej weryfikacji. Jasne, ViewBinding jest obecnie najlepszą opcją do programowania Java (zamiennik ButterKnife ), ale nie ma żadnej lub ma niewielką przewagę nad KAE w Kotlin (patrz sekcja Nieprawidłowe użycie układu ).
Uwaga dodatkowa: Jestem pewien, że ludzie DataBinding polubią ViewBinding :)
źródło
DataBinding
? Myślę, że podstawową funkcją jest całkowite zaprzestanie korzystania z odniesień do widoku. Nawiasem mówiąc, możesz „rzucić” model widoku przez<include ... />
tagi, co jest kolejną dużą zaletą.ViewBinding
rozwiązał największy problemkotlinx.android.synthetic
. Wsynthetic
wiążący, jeśli w Treści do układu, a następnie wpisz identyfikator, który istnieje tylko w innym układzie, IDE pozwala uzupełni i dodać nową instrukcję import. O ile programista nie sprawdzi, czy wyciągi importowe importują tylko prawidłowe widoki, nie ma bezpiecznego sposobu na sprawdzenie, czy nie spowoduje to problemów z czasem wykonywania. Ale w obiekcieViewBinding
powinieneś użyćlayout
obiektu wiązania, aby uzyskać dostęp do jego widoków, aby nigdy nie wywoływać widoku w innym układzie, a jeśli chcesz to zrobić, otrzymasz błąd kompilacji, a nie błąd wykonania. Oto przykład.Tworzymy dwa układy zwane
activity_main
iactivity_other
tak:Teraz, jeśli napiszesz swoją aktywność w ten sposób:
kod zostanie skompilowany bez żadnego błędu, ale aplikacja ulegnie awarii w czasie wykonywania. Ponieważ widok o
message_other
identyfikatorze nie istnieje,activity_main
a kompilator tego nie sprawdził. Ale jeśli używaszViewBinding
tak:Twój kod nigdy się nie skompiluje i
Android Studio
wyświetli błąd w ostatniej linii.źródło
kotlinx.android.synthetic nie jest już zalecaną praktyką, powiedział Google w jednym komunikacie zatwierdzenia „jednym z wątków Reddit
https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "
Synthetics nie jest rozwijany przez google, jest częścią rozszerzenia kotlin dla Androida stworzonego przez JetBrains i stopniowo google programiści Androida zaczęli zamieniać Synthetics na ViewBindins w swoich demach i kodach źródłowych.
„Teraz pojawia się pytanie, które musimy wziąć pod uwagę.”
Według google (View binding, ButterKnife, Kotlin syntetyki) biblioteki te są z powodzeniem używane przez wiele aplikacji i rozwiązują ten sam problem.
Jednak w przypadku większości aplikacji Google zaleca wypróbowanie powiązania widoku zamiast tych bibliotek, ponieważ wiązanie widoku zapewnia bezpieczniejsze, bardziej zwięzłe wyszukiwanie widoku.
Załączony obraz odniesienia, aby szybko wyczyścić.
Jeśli jednak chcesz przejść do dept, możesz użyć poniższego linku. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
źródło
or after view lifecycle ends
część?apply plugin: 'kotlin-android-extensions'
vsviewBinding { enabled = true }
. Niewielka różnica.