ViewBinding vs Kotlin Android Extensions dengan tampilan sintetis

38

Bagaimana perbandingan ViewBinding baru dengan Kotlin Android Extensions dengan binding tampilan sintetis?

Selain membentuk NullSafety dan TypeSafety yang disediakan oleh ViewBindings baru, mengapa kita harus mempertimbangkan cara Kotlin menggunakan binding sintetik pada Views.

Apakah ViewBinding baru lebih berkinerja karena menghasilkan kelas Binding sebelumnya?

Rinav
sumber
Saya membuat pertanyaan yang agak mirip di mendiskusikan.kotlinlang. Jika ada yang memiliki pemikiran tentang topik ini, jangan ragu untuk menjawab :)
xinaiz
1
Lihatlah The Argument Over Kotlin Synthetics untuk lebih banyak latar belakang.
Cheticamp

Jawaban:

69

Mari kita tinjau keduanya.


Konfigurasi

Ekstensi Android Kotlin

  1. Impor ekstensi sintetis tata letak yang sesuai: import kotlinx.android.synthetic.main.<layout>.*
  2. Referensi pandangan dalam kode melalui id mereka: textView.text = "Hello, world!". Ekstensi ini bekerja pada: Activities, Fragmentsdan Views.

Lihat Binding

  1. Buat referensi yang mengikat di dalam kelas Anda: private lateinit var binding YourClassBinding
  2. Mengembang mengikat Anda binding = YourClassBinding.inflate(layoutInflater)dalam Activity's onCreatedan panggilan setContentView(binding.root), atau mengembang di Fragment' s onCreateViewkemudian kembali:return binding.root
  3. Tampilan referensi dalam kode melalui ikatan menggunakan id mereka binding.textView.text = "Hello, world!"

Ketik keamanan

Kotlin Android Extensions dan ViewBinding adalah tipe aman menurut definisi, karena pandangan yang direferensikan telah dicasting ke tipe yang sesuai.


Keamanan kosong

Kotlin Android Extensions dan ViewBinding keduanya aman nol. ViewBinding tidak memiliki keunggulan di sini . Dalam kasus KAE , jika tampilan hanya ada di beberapa konfigurasi tata letak, IDE akan menunjukkannya untuk Anda:

masukkan deskripsi gambar di sini

Jadi Anda memperlakukannya sebagai jenis nullable lainnya di Kotlin, dan kesalahannya akan hilang:

masukkan deskripsi gambar di sini


Menerapkan perubahan tata letak

Dalam kasus Kotlin Android Extensions , perubahan tata letak langsung diterjemahkan ke generasi ekstensi sintetis, sehingga Anda dapat menggunakannya segera. Dalam hal ViewBinding , Anda harus membangun proyek Anda


Penggunaan tata letak salah

Dalam kasus Kotlin Android Extensions , dimungkinkan untuk mengimpor ekstensi sintetis tata letak yang salah, sehingga menyebabkan NullPointerException. Hal yang sama berlaku untuk ViewBinding , karena kita dapat mengimpor Bindingkelas yang salah . Meskipun, lebih mungkin untuk mengabaikan impor yang salah daripada nama kelas yang salah, terutama jika file tata letak dinamai Activity/ Fragment/ View, jadi ViewBinding lebih unggul di sini.


Ringkasan KAE vs ViewBinding

  • Ketik keamanan - Draw.
  • Keamanan kosong - Draw.
  • Kode Boilerplate - KAE menang. Dari dokumentasi Kotlin Android Extensions :

Plugin Kotlin Android Extensions memungkinkan kita untuk mendapatkan pengalaman yang sama dengan beberapa perpustakaan ini, tanpa harus menambahkan kode tambahan.

  • Menerapkan perubahan tata letak - KAE menang. Perubahan instan berbeda dengan ViewBinding .
  • Penggunaan tata letak yang salah - ViewBinding menang

Saya pikir ada kesalahpahaman besar tentang ViewBinding menjadi pengganti KAE . Orang-orang mendengar kata kunci besar dan mengulanginya tanpa memverifikasi terlebih dahulu. Tentu, ViewBinding adalah pilihan terbaik untuk pengembangan Java saat ini (pengganti ButterKnife ), tetapi tidak ada atau sedikit keuntungan dibandingkan KAE di Kotlin (lihat bagian Penggunaan tata letak yang salah ).

Catatan: Saya yakin orang-orang DataBinding akan menyukai ViewBinding :)

xinaiz
sumber
Mengapa Anda tidak mengatakan apa-apa tentang menggunakan variabel dalam DataBinding? Saya pikir ini fitur yang sangat penting untuk berhenti menggunakan referensi tampilan sama sekali. Omong-omong, Anda dapat "melempar" model tampilan Anda melalui <include ... />tag, yang merupakan keuntungan besar lainnya.
Ircover
1
@ Arcover Pertanyaannya adalah tentang perbandingan KAE dan ViewBinding. DataBinding bukan bagian dari pertanyaan itu.
xinaiz
Aduh, maaf) Kesalahpahaman sederhana.
Ircover
1
@ BenLewis jika pengikatan Anda didefinisikan sebagai lateinit Anda masih memiliki masalah yang sama. Itu berarti tidak ada meter apa yang Anda gunakan KAE atau ViewBinding Anda harus mengikuti beberapa aturan ketat saat menulis kode dalam fragmen.
Flavio
1
"Menerapkan perubahan tata letak" - Saat menggunakan ViewBinding, Anda tidak perlu membangun proyek Anda, setelah menambahkan tampilan baru dengan id, Anda dapat langsung melakukan "binding.myTextView ..".
Tayyab Mazhar
19

ViewBindingmemecahkan masalah terbesar kotlinx.android.synthetic. Dalam syntheticpenjilidan jika Anda mengatur tampilan konten Anda ke tata letak, lalu ketik id yang hanya ada di tata letak yang berbeda, IDE memungkinkan Anda melengkapi otomatis dan menambahkan pernyataan impor baru. Kecuali pengembang secara khusus memeriksa untuk memastikan pernyataan impor mereka hanya mengimpor tampilan yang benar, tidak ada cara aman untuk memverifikasi bahwa ini tidak akan menyebabkan masalah runtime. Tetapi di dalam ViewBindingAnda harus menggunakan layoutobjek mengikat Anda untuk mengakses pandangannya sehingga Anda tidak pernah meminta tampilan dalam tata letak yang berbeda dan jika Anda ingin melakukan ini Anda akan mendapatkan kesalahan kompilasi bukan kesalahan runtime. Berikut ini sebuah contoh.

Kami membuat dua tata letak yang disebut activity_maindan activity_otherseperti itu:

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>

Sekarang jika Anda menulis aktivitas Anda seperti ini:

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!"
    }
}

kode Anda akan dikompilasi tanpa kesalahan tetapi aplikasi Anda akan macet saat runtime. Karena tampilan dengan message_otherid tidak ada di dalam activity_maindan kompiler tidak memeriksa ini. Tetapi jika Anda menggunakan ViewBindingseperti:

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!"
    }
}

kode Anda tidak akan pernah dikompilasi dan Android Studiomenunjukkan kesalahan pada baris terakhir.

Squti
sumber
1
Anda juga dapat menggunakan LayoutInflater untuk mengembang tampilan dan kemudian referensi bidang yang ditentukan melalui variabel.
NapoleonTheCake
4
Ini tampaknya sangat tidak mungkin terjadi dalam skenario kehidupan nyata.
Bencri
1
Contohnya tidak masuk akal. Anda salah menggunakannya. Mengapa Anda mengimpor hal yang salah (activity_other)? Setiap kerangka kerja yang Anda gunakan salah dapat menyebabkan masalah.
pengembang android
2

kotlinx.android.synthetic tidak lagi direkomendasikan, kata google dalam satu pesan komit "salah satu utas Reddit

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

Sintetis tidak dikembangkan oleh google, ini adalah bagian dari ekstensi android kotlin yang dibuat oleh JetBrains dan secara bertahap google android developer mulai mengganti Synthetics dengan ViewBindins dalam demo dan kode sumber mereka.

"Sekarang pertanyaan datang, yang mana yang harus kita pertimbangkan."

Menurut google (View binding, ButterKnife, Kotlin synthetics) perpustakaan ini berhasil digunakan oleh banyak aplikasi dan menyelesaikan masalah yang sama.

Tetapi untuk sebagian besar aplikasi, Google merekomendasikan untuk mencoba pengikatan tampilan alih-alih pustaka ini karena pengikatan tampilan memberikan tampilan yang lebih aman, lebih ringkas.

Gambar referensi terlampir untuk menghapus hal-hal dengan cepat. masukkan deskripsi gambar di sini

Namun jika Anda ingin masuk ke dept, Anda dapat mengikuti tautan di bawah ini. https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc

SourabhTech
sumber
2
1. Selalu nol-aman - Pengikatan tampilan akan tetap macet jika digunakan sebelum inflasi atau setelah siklus hidup tampilan berakhir - tidak ada yang berbeda dari sintetis - harus MERAH untuk ViewBinding. 2. Hanya id referensi dari tata letak saat ini - itu benar, tetapi IDE menunjukkan dari tata letak mana Anda ingin mengimpor id yang diberikan, jadi itu bukan masalah besar. 3. Mendukung Kotlin & Java - argumen buruk, jika Anda dapat menggunakan Kotlin dalam pengembangan android lalu mengapa menggunakan Java. 4. Jumlah kode yang diperlukan - Sintetis Kotlin memiliki jumlah terendah, harus Sangat rendah dalam tabel.
xinaiz
@xinaiz Mengapa Anda menggunakannya sebelum menggembung, ikuti cara yang benar untuk menggunakannya jika tidak, Anda pasti akan menghadapi masalah. Sudahkah Anda membaca tautan sebelum mengundurkan diri dan memposting komentar medium.com/androiddevelopers/...
SourabhTech
Ya, saya sudah membacanya beberapa waktu lalu. Saya tidak menggunakannya sebelum menggembung, saya hanya mengatakan itu mungkin. "Cara yang benar" menyiratkan bahwa ada risiko, bukan? Juga, Anda melewatkan or after view lifecycle endsbagian?
xinaiz
@xinaiz 2.Tapi ada peluang untuk menggunakan id yang salah jika proyek lebih besar dan juga untuk nama sumber daya yang sama jika multi developer mengerjakan proyek. 3.Ya mungkin ada persyaratan proyek di mana Anda harus menggunakan java dan kotlin keduanya (Jika proyek sudah dikembangkan di java dan mulai pengairan dengan kotlin maka pasti itu membantu) 4. Untuk Sintetis Anda harus mengimpor perpustakaan yang terpisah tetapi untuk pengikatan tampilan itu sudah ada di Gradle, Jadi jelas butuh kode yang lebih rendah.
SourabhTech
1
Menanggapi 4. Perpustakaan apa? Ini diaktifkan secara default. Ini argumen tentang apply plugin: 'kotlin-android-extensions'vs viewBinding { enabled = true }. Tidak banyak perbedaan.
xinaiz