Sentetik manzaralı ViewBinding vs Kotlin Android Uzantıları


38

Yeni ViewBinding , sentetik görünümleri olan Kotlin Android Extensions ile nasıl karşılaştırılır ?

Yeni ViewBindings tarafından sağlanan NullSafety ve TypeSafety dışında, neden Kotlin'in Views'da sentetik bağlama kullanmanın yolunu atmayı düşünmeliyiz.

Yeni ViewBinding, Binding sınıfını önceden oluşturduğundan daha fazla performans sergiliyor mu?


Oluşturduğum biraz benzer bir soru discuss.kotlinlang üzerinde. Konu hakkında düşünceleriniz varsa, cevap vermekten çekinmeyin :)
xinaiz

1
Daha fazla bilgi için Argument Over Kotlin Synthetics'e bir göz atın .
Cheticamp

Yanıtlar:


69

İkisini gözden geçirelim.


Yapılandırma

Kotlin Android Uzantıları

  1. Uygun düzen sentetik uzantılarını içe aktarın: import kotlinx.android.synthetic.main.<layout>.*
  2. Onların kimlikleri aracılığıyla kodunda görüşlerini başvurusu: textView.text = "Hello, world!". Bu uzantılar üzerinde çalışmak: Activities, Fragmentsve Views.

Bağlamayı Görüntüle

  1. Sınıfınızın içinde bağlayıcı referans oluşturun: private lateinit var binding YourClassBinding
  2. Senin bağlama şişirmek binding = YourClassBinding.inflate(layoutInflater)içini Activity'ın onCreateve çağrı setContentView(binding.root), ya da o şişirmek Fragments' onCreateViewiade o zaman:return binding.root
  3. Kimliklerini kullanarak bağlama yoluyla koddaki referans görünümleri binding.textView.text = "Hello, world!"

Tip güvenliği

Başvurulan görünümler zaten uygun türlere çevrildiğinden Kotlin Android Uzantıları ve ViewBinding tanım olarak güvenlidir.


Boş güvenlik

Kotlin Android Uzantıları ve ViewBinding her ikisi de güvende değil. ViewBinding'ın burada bir avantajı yok . KAE durumunda, görünüm yalnızca bazı düzen yapılandırmalarında mevcutsa, IDE bunu sizin için gösterecektir:

resim açıklamasını buraya girin

Bu yüzden sadece Kotlin'deki diğer boş değerli türler olarak davranırsınız ve hata kaybolur:

resim açıklamasını buraya girin


Düzen değişikliklerini uygulama

Kotlin Android Uzantıları durumunda , düzen değişiklikleri anında sentetik uzantıların oluşturulmasına dönüşür, böylece bunları hemen kullanabilirsiniz. ViewBinding durumunda, projenizi oluşturmanız gerekir


Yanlış düzen kullanımı

Kotlin Android Uzantıları durumunda, yanlış düzen sentetik uzantılarını içe aktarmak ve böylece neden olmak mümkündür NullPointerException. Aynısı ViewBinding için de geçerlidir , çünkü yanlış Bindingsınıfı içe aktarabiliriz . Her ne kadar, özellikle düzen dosyası Activity/ Fragment/ öğesinden sonra iyi adlandırılmışsa, yanlış sınıf adından daha fazla yanlış içe aktarmayı göz ardı etmek daha olasıdır View, bu nedenle ViewBinding burada üst tarafa sahiptir.


KAE vs ViewBinding özeti

  • Tip güvenliği - Çizim.
  • Boş güvenlik - Çizim.
  • Ortak kod - KAE kazanır. Kotlin Android Uzantıları belgelerinden :

Kotlin Android Extensions eklentisi, bu kodlardan bazılarında sahip olduğumuz aynı deneyimi, ekstra kod eklemenize gerek kalmadan elde etmemizi sağlar.

  • Düzen değişikliklerini uygulama - KAE kazanır. ViewBinding'ın aksine değişiklikler anında yapılır .
  • Yanlış düzen kullanımı - ViewBinding kazanıyor

Bence ViewBinding KAE yerine ikame hakkında büyük bir yanlış anlama var . İnsanlar büyük anahtar kelimeleri duyar ve önceden doğrulamadan tekrarlar. Tabii, ViewBinding şu anda Java geliştirme için en iyi seçenek (için yerine geçer BUTTERKNIFE ), ancak üzerinde hiç ya da az avantaj KAE KOTLIN içinde (bkz Yanlış düzen kullanım bölümü).

Yan not: Eminim DataBinding insanlar ViewBinding seveceksiniz :)


Neden değişkenleri kullanma hakkında bir şey söylemediniz DataBinding? Görünüm referanslarını kullanmayı bırakmanın temel bir özellik olduğunu düşünüyorum. Bu arada, görünüm modelinizi <include ... />başka bir büyük avantaj olan etiketler aracılığıyla "atabilirsiniz" .
Ircover

1
@Ircover Soru KAE ve ViewBinding karşılaştırması hakkındaydı. DataBinding bu sorunun bir parçası değildir.
xinaiz

Hata, üzgünüm) Basit yanlış anlama.
Ircover

1
@BenLewis, bağlantınızın lateinit olarak tanımlanması hâlâ aynı sorunu yaşıyorsa. Bu, KAE veya ViewBinding kullandığınız ölçerin parçaya kod yazarken bazı katı kurallara uymanız gerektiği anlamına gelir.
Flavio

1
"Düzen değişiklikleri uygulama" - ViewBinding kullanırken, bir id ile yeni bir görünüm ekledikten sonra, anında "bağlama.myTextView .." yapabilirsiniz projenizi oluşturmak zorunda değilsiniz.
Tayyab Mazhar

19

ViewBindingen büyük sorunu çözdü kotlinx.android.synthetic. Gelen syntheticbir düzen için içerik görünümü ayarlarsanız bağlayıcı, daha sonra sadece farklı düzende mevcut olduğunu belirten bir kimliği yazın IDE otomatik tamamlamak ve yeni import ifadesini eklemenizi sağlar. Geliştirici, içe aktarma ifadelerinin yalnızca doğru görünümleri içe aktardığından emin olmak için özel olarak kontrol etmedikçe, bunun bir çalışma zamanı sorununa neden olmayacağını doğrulamanın güvenli bir yolu yoktur. Ancak ViewBinding, layoutbağlama nesnesini görünümlerine erişmek için kullanmanız gerekir , böylece asla farklı bir düzende bir görünüme çağırmazsınız ve bunu yapmak isterseniz bir çalışma zamanı hatası değil bir derleme hatası alırsınız. İşte bir örnek.

Biz denilen iki düzenleri oluşturmak activity_mainve activity_otherşöyle:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <TextView
        android:id="@+id/message_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

activity_other.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                >

    <TextView
        android:id="@+id/message_other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

Şimdi faaliyetinizi şöyle yazarsanız:

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_other.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //Application will crash because "message_other" doesn't exist in "activity_main"
        message_other.text = "Hello!"
    }
}

kodunuz hatasız derlenecek, ancak uygulamanız çalışma zamanında kilitlenecektir. Çünkü message_otherkimliğe sahip görünüm mevcut değil activity_mainve derleyici bunu kontrol etmedi. Ancak böyle kullanırsanız ViewBinding:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        //This code will never compile and the IDE shows you an error
        binding.message_other.text = "Hello!"
    }
}

kodunuz asla derlenmez ve Android Studioson satırda bir hata gösterir.


1
Ayrıca, Görünümü şişirmek ve ardından tanımlanmış alanlarına değişken aracılığıyla başvuruda bulunmak için LayoutInflater'ı kullanabilirsiniz.
NapoleonTheCake

4
Bunun gerçek yaşam senaryosunda olması pek olası görünmüyor.
Bencri

1
Örnek mantıklı değil. Yanlış kullandınız. Neden yanlış şeyi içe aktarasınız (etkinlik_diğer)? Yanlış kullandığınız her çerçeve soruna neden olabilir.
android geliştirici

2

kotlinx.android.synthetic artık önerilen bir uygulama değil, google tarafından "Reddit iş parçacığından biri"

https://android-review.googlesource.com/c/platform/frameworks/support/+/882241 "

Synthetics google tarafından geliştirilmemiştir, JetBrains tarafından hazırlanmış kotlin android uzantısının bir parçasıdır ve yavaş yavaş google android geliştiricileri, demoları ve kaynak kodlarında Synthetics'i ViewBindins ile değiştirmeye başladı.

"Şimdi soru geliyor, hangisini dikkate almalıyız."

Google'a göre (Görünüm bağlaması, ButterKnife, Kotlin sentetikleri) bu kütüphaneler birçok uygulama tarafından başarıyla kullanılmaktadır ve aynı sorunu çözmektedir.

Ancak uygulamaların çoğu için google bu kitaplıklar yerine görünüm bağlamayı denemenizi önerir çünkü görünüm bağlaması daha güvenli, daha özlü bir görünüm araması sağlar.

İşleri hızlı bir şekilde temizlemek için ekli referans resmi. resim açıklamasını buraya girin

Eğer borç gitmek istiyorsanız Ancak aşağıdaki bağlantıyı takip edebilirsiniz. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc


2
1. Her zaman null güvenlidir - Enflasyondan önce veya görünüm yaşam döngüsü sona erdikten sonra kullanılırsa görünüm bağlaması yine de çökecektir - sentetiklerden farklı bir şey değil - ViewBinding için KIRMIZI olmalıdır. 2. Yalnızca geçerli mizanpajdaki kimliklere referans verin - bu doğrudur, ancak IDE, verilen kimliği almak istediğiniz mizanpajı belirtiyor, bu yüzden büyük bir sorun değil. 3. Kotlin ve Java destekler - kötü argüman, eğer kotlin android geliştirme kullanabilirsiniz o zaman neden Java kullanın. 4. Gerekli kod miktarı - Kotlin sentetiklerinin en düşük miktarı vardır, tabloda çok düşük olmalıdır.
xinaiz

@xinaiz Şişirmeden önce neden kullanıyorsunuz, aksi takdirde sorunlarla karşılaşacağınızdan emin olmak için doğru yolu kullanın. Aşağıya oy vermeden önce bağlantıyı gözden geçirdiniz ve yorum yazdınız orta.com/androiddevelopers/…
SourabhTech

Evet, bir süre önce okudum. Şişirmeden önce kullanmıyorum, sadece mümkün olduğunu söylüyorum. "Doğru yol" risklerin olduğu anlamına gelir, değil mi? Ayrıca, or after view lifecycle endsbölümü atladın mı?
xinaiz

2.Ama proje daha büyükse yanlış kimliği kullanma şansı vardır ve aynı zamanda proje üzerinde çalışan çoklu geliştirici de aynı kaynak adı için. 3.Evet hem java hem de kotlin'i kullanmanız gereken bir proje gereksinimi olabilir (Eğer proje zaten java'da geliştirilmiş ve kotlin ile çalışmaya başlamışsa o zaman kesinlikle yardımcı olur) 4. Sentetikler için ayrı kitaplığı içe aktarmanız gerekir, ancak görünüm bağlayıcı Gradle'da zaten var, Açıkçası daha az kod aldı.
SourabhTech

1
4. Hangi kütüphane? Varsayılan olarak etkindir. apply plugin: 'kotlin-android-extensions'Vs ile ilgili bir tartışma viewBinding { enabled = true }. Çok fark yok.
xinaiz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.