सिंथेटिक विचारों के साथ ViewBinding बनाम Kotlin एंड्रॉयड एक्सटेंशन


38

सिंथेटिक व्यू बाइंडिंग वाले कोटलिन एंड्रॉइड एक्सटेंशन के साथ नए व्यूबाइंडिंग की तुलना कैसे की जाती है ?

नए ViewBindings द्वारा प्रदान की गई NullSafety और TypeSafety के अलावा, हमें Views पर सिंथेटिक बाइंडिंग का उपयोग करने के Kotlin तरीके पर खाई पर विचार क्यों करना चाहिए।

क्या नया ViewBinding अधिक प्रदर्शन है क्योंकि यह हाथ से पहले बंधन वर्ग उत्पन्न करता है?


मैंने चर्चा पर कुछ इसी तरह का प्रश्न बनाया । यदि किसी के विषय में कोई विचार है, तो बेझिझक प्रतिक्रिया दें :)
xinaiz

1
कुछ और पृष्ठभूमि के लिए द कोटलिन सिंथेटिक्स पर तर्क पर एक नज़र डालें ।
Canticamp

जवाबों:


69

आइए दोनों की समीक्षा करें।


विन्यास

कोटलिन Android एक्सटेंशन

  1. उचित लेआउट सिंथेटिक एक्सटेंशन आयात करें: import kotlinx.android.synthetic.main.<layout>.*
  2. उनकी आईडी के माध्यम से कोड में संदर्भ विचार textView.text = "Hello, world!":। इन एक्सटेंशन पर काम: Activities, Fragmentsऔर Views

बाइंडिंग देखें

  1. अपनी कक्षा के अंदर बाध्यकारी संदर्भ बनाएँ: private lateinit var binding YourClassBinding
  2. अपने बंधन बढ़ binding = YourClassBinding.inflate(layoutInflater)अंदर Activityकी onCreateऔर कॉल setContentView(binding.root), या उस में बढ़ Fragment'रहा है onCreateViewतो इसे वापस:return binding.root
  3. उनके आईडी का उपयोग करके बाध्यकारी के माध्यम से कोड में संदर्भ विचार binding.textView.text = "Hello, world!"

प्रकार की सुरक्षा

कोटलिन एंड्रॉइड एक्सटेंशन और व्यूबाइंडिंग परिभाषा द्वारा सुरक्षित हैं, क्योंकि संदर्भित विचार पहले से ही उपयुक्त प्रकारों में डाले गए हैं।


अशक्त सुरक्षा

कोटलिन एंड्रॉइड एक्सटेंशन और व्यूबाइंडिंग दोनों सुरक्षित हैं। व्यूबाइंडिंग का यहां कोई फायदा नहीं हैKAE के मामले में , यदि दृश्य केवल कुछ लेआउट कॉन्फ़िगरेशन में मौजूद है, तो IDE इंगित करेगा कि आपके लिए:

यहां छवि विवरण दर्ज करें

तो आप इसे कोटलिन में किसी भी अन्य अशक्त प्रकार के रूप में मानते हैं, और त्रुटि गायब हो जाएगी:

यहां छवि विवरण दर्ज करें


लेआउट परिवर्तन लागू करना

कोटलिन एंड्रॉइड एक्सटेंशन के मामले में , लेआउट तुरंत सिंथेटिक एक्सटेंशन की पीढ़ी में अनुवाद करता है, इसलिए आप उन्हें तुरंत उपयोग कर सकते हैं। व्यूबाइंडिंग के मामले में , आपको अपना प्रोजेक्ट बनाना होगा


गलत लेआउट का उपयोग

कोटलिन एंड्रॉइड एक्सटेंशन के मामले में , गलत लेआउट सिंथेटिक एक्सटेंशन को आयात करना संभव है, इस प्रकार कारण NullPointerException। हम ViewBinding पर लागू होते हैं , क्योंकि हम गलत Bindingवर्ग आयात कर सकते हैं । हालांकि, गलत वर्ग नाम की तुलना में गलत आयात को नजरअंदाज करना अधिक संभव है, खासकर अगर लेआउट फ़ाइल को अच्छी तरह से Activity/ Fragment/ के नाम पर रखा गया है View, तो ViewBinding का ऊपरी हाथ यहां है।


KAE बनाम व्यूबाइंडिंग का सारांश

  • प्रकार की सुरक्षा - ड्रा।
  • अशक्त सुरक्षा - ड्रा।
  • बॉयलरप्लेट कोड - KAE जीतता है। Kotlin Android एक्सटेंशन दस्तावेज़ से :

कोटलिन एंड्रॉइड एक्सटेंशन प्लगइन हमें बिना किसी अतिरिक्त कोड को जोड़ने के बिना इन पुस्तकालयों में से कुछ के साथ एक ही अनुभव प्राप्त करने की अनुमति देता है।

  • लेआउट परिवर्तन लागू करना - KAE जीतता है। व्यूबाइंडिंग के विपरीत परिवर्तन तत्काल हैं ।
  • गलत लेआउट उपयोग - ViewBinding जीतता है

मुझे लगता है कि KAE के लिए ViewBinding के प्रतिस्थापन के बारे में बड़ी गलत धारणा है । लोग बड़े कीवर्ड सुनते हैं और उसे पहले से सत्यापित किए बिना दोहराते हैं। निश्चित रूप से, Java विकास के लिए ViewBinding अभी सबसे अच्छा विकल्प है ( ButterKnife के लिए प्रतिस्थापन ), लेकिन कोटलिन में KAE पर कोई गलत फायदा नहीं हुआ है ( गलत लेआउट उपयोग अनुभाग देखें)।

साइड नोट: मुझे यकीन है कि डेटाबाइंडिंग लोग ViewBinding को पसंद करेंगे :)


आपने चर का उपयोग करने के बारे में कुछ क्यों नहीं कहा DataBinding? मुझे लगता है कि यह सभी में दृश्य संदर्भों का उपयोग बंद करने के लिए आवश्यक विशेषता है। वैसे, आप अपने व्यू मॉडल को <include ... />टैग के माध्यम से "फेंक" सकते हैं , जो एक और बड़ा फायदा है।
इस्कवर

1
@ प्रश्न KAE और व्यूबाइंडिंग के बारे में प्रश्न था। डेटाबाइंडिंग उस सवाल का हिस्सा नहीं है।
xinaiz

वूप्स, सॉरी) सिंपल गलतफहमी।
इस्कवर

1
@BenLewis यदि आपकी बाइंडिंग लेटीनिट के रूप में परिभाषित की गई है तो भी आपको वही समस्या है। इसका मतलब है कि कोई भी मीटर जो आप केएई या व्यूबाइंडिंग का उपयोग नहीं करते हैं, आपको खंड में कोड लिखते समय कुछ सख्त नियमों का पालन करना होगा।
फ्लेवियो

1
"लेआउट परिवर्तन लागू करना" - ViewBinding का उपयोग करते समय, आपको अपना प्रोजेक्ट नहीं बनाना होगा, एक आईडी के साथ एक नया दृश्य जोड़ने के बाद, आप तुरंत "बाइंडिंग .myTextView .." कर सकते हैं।
तैयब मजहर

19

ViewBindingकी सबसे बड़ी समस्या का हल kotlinx.android.synthetic। में syntheticबाध्यकारी यदि आप एक लेआउट के लिए अपनी सामग्री को देखने के लिए सेट है, तो एक आईडी टाइप है कि केवल एक भिन्न लेआउट में मौजूद है, आईडीई आप स्वत: पूर्ण और नए आयात बयान जोड़ सकते हैं। जब तक डेवलपर विशेष रूप से यह सुनिश्चित करने के लिए जांच नहीं करता है कि उनके आयात विवरण केवल सही विचार आयात करते हैं, यह सत्यापित करने का कोई सुरक्षित तरीका नहीं है कि इससे रनटाइम समस्या नहीं होगी। लेकिन ViewBindingआपको अपने layoutबाध्यकारी ऑब्जेक्ट का उपयोग उसके विचारों तक पहुंचने के लिए करना चाहिए ताकि आप कभी भी किसी अलग लेआउट में किसी दृश्य को न देखें और यदि आप ऐसा करना चाहते हैं तो आपको एक संकलन त्रुटि मिलेगी न कि रनटाइम त्रुटि। यहाँ एक उदाहरण है।

हम दो लेआउट बनाते हैं जिन्हें कॉल किया जाता है activity_mainऔर activity_otherजैसे:

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>

अब अगर आप अपनी गतिविधि इस तरह लिखते हैं:

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

आपका कोड बिना किसी त्रुटि के संकलित होगा लेकिन आपका एप्लिकेशन रनटाइम पर क्रैश हो जाएगा। क्योंकि message_otherआईडी वाला दृश्य मौजूद नहीं है activity_mainऔर संकलक ने यह जाँच नहीं की है। लेकिन अगर आप 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!"
    }
}

आपका कोड कभी संकलित नहीं होगा और Android Studioआपको अंतिम पंक्ति में एक त्रुटि दिखाता है।


1
आप व्यू को भड़काने के लिए LayoutInflater का भी उपयोग कर सकते हैं और फिर इसके परिभाषित क्षेत्रों को चर के माध्यम से संदर्भित कर सकते हैं।
नेपोलियन

4
यह वास्तविक जीवन परिदृश्य में होने की संभावना बहुत कम लगती है।
बेनक्री

1
उदाहरण का कोई मतलब नहीं है। आपने इसका गलत इस्तेमाल किया। आप गलत चीज़ को क्यों आयात करेंगे (activity_other)? हर फ्रेम जिसे आप गलत तरीके से इस्तेमाल करते हैं, मुद्दों का कारण बन सकते हैं।
Android डेवलपर

2

kotlinx.android.synthetic अब एक अनुशंसित संदेश नहीं है, जिसे एक प्रतिबद्ध संदेश में कहा गया है "रेडड्रेड थ्रेड में से एक

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

सिंथेटिक्स को Google द्वारा विकसित नहीं किया गया है, यह JetBrains द्वारा तैयार किए गए कोटलिन एंड्रॉइड एक्सटेंशन का एक हिस्सा है और धीरे-धीरे Google एंड्रॉइड डेवलपर्स ने सिंथेटिक्स को उनके डेमो और सोर्स-कोड में ViewBindins के साथ बदलना शुरू कर दिया।

"अब सवाल आता है, कि हमें इसे किस पर विचार करना है।"

Google के अनुसार (देखें बाइंडिंग, बटरकनीफ़, कोटलिन सिंथेटिक्स) इन पुस्तकालयों का उपयोग कई ऐप द्वारा सफलतापूर्वक किया जाता है और इसी समस्या को हल करता है।

लेकिन अधिकांश ऐप्स के लिए Google इन पुस्तकालयों के बजाय व्यू बाइंडिंग को आज़माने की सलाह देता है क्योंकि व्यू बाइंडिंग सुरक्षित, अधिक संक्षिप्त दृश्य लुकअप प्रदान करता है।

चीजों को जल्दी से साफ करने के लिए संलग्न संदर्भ छवि। यहां छवि विवरण दर्ज करें

हालाँकि यदि आप विभाग में जाना चाहते हैं तो आप नीचे दिए गए लिंक का अनुसरण कर सकते हैं। https://medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc


2
1. हमेशा शून्य-सुरक्षित - देखें बाध्यकारी अभी भी दुर्घटनाग्रस्त हो जाएगी यदि मुद्रास्फीति से पहले या जीवन चक्र समाप्त होने के बाद उपयोग किया जाता है - सिंथेटिक्स से अलग कुछ भी नहीं है - ViewBinding के लिए लाल होना चाहिए। 2. वर्तमान लेआउट से केवल संदर्भ आईडी - यह सच है, लेकिन आईडीई बताता है कि आप किस लेआउट से दिए गए आईडी को आयात करना चाहते हैं, इसलिए यह एक बड़ी समस्या नहीं है। 3. कोटलिन और जावा का समर्थन करता है - बुरा तर्क, यदि आप एंड्रॉइड विकास में कोटलिन का उपयोग कर सकते हैं तो जावा का उपयोग क्यों करें। 4. आवश्यक कोड की मात्रा - कोटलिन सिंथेटिक्स में सबसे कम राशि है, तालिका में बहुत कम होना चाहिए।
xinaiz

@xinaiz आप फुलाए जाने से पहले इसका उपयोग क्यों कर रहे हैं, इसका सही तरीके से उपयोग करें अन्यथा आप समस्याओं का सामना करेंगे। आप downvote से पहले लिंक के माध्यम से चला और टिप्पणी पोस्ट की है medium.com/androiddevelopers/...
SourabhTech

हां, मैंने इसे कुछ समय पहले पढ़ा है। मैं इसे फुलाए जाने से पहले उपयोग नहीं कर रहा हूं, मैं सिर्फ यह कह रहा हूं कि यह संभव है। "सही तरीका" का अर्थ है कि जोखिम हैं, है ना? इसके अलावा, आप or after view lifecycle endsभाग छोड़ दिया ?
xinaiz

@xinaiz 2. लेकिन अगर प्रोजेक्ट पर काम करने वाले मल्टी डेवलपर के लिए प्रोजेक्ट बड़ा है और समान संसाधन नाम के लिए भी गलत आईडी का उपयोग करने का मौका है। 3. हाँ वहाँ एक परियोजना की आवश्यकता हो सकती है जहाँ आपको जावा और कोटलिन दोनों का उपयोग करना पड़ता है (यदि परियोजना पहले से ही जावा में विकसित की गई है और कोटलिन के साथ एकीकरण शुरू किया है तो निश्चित रूप से यह मदद करता है) 4. सिंथेटिक्स के लिए आपको अलग-अलग पुस्तकालय आयात करना होगा लेकिन बाध्यकारी देखने के लिए। यह पहले से ही ग्रैडल में है, इसलिए जाहिर है कि इसने कम कोड लिया है।
सौरभटेक 11:11

1
4. किस पुस्तकालय के जवाब में? यह डिफ़ॉल्ट रूप से सक्षम है। यह apply plugin: 'kotlin-android-extensions'बनाम का तर्क है viewBinding { enabled = true }। ज्यादा अंतर नहीं।
xinaiz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.