मल्टी मॉड्यूल प्रोजेक्ट में डैगर2 से हिल्ट में माइग्रेट करें
बहु-मॉड्यूल परियोजना में Dagger
से में माइग्रेट करने के लिए चरण-दर-चरण मार्गदर्शिका ।Hilt
परियोजना संरचना
परियोजना की कल्पना करने के लिए, इसमें कई मॉड्यूल शामिल हैं NetworkModule, StorageModule, CommonModule, FeatureModule आदि। वास्तविक परियोजनाओं में कई और मॉड्यूल हो सकते हैं लेकिन हम निम्नलिखित मॉड्यूल तक सीमित हैं।
प्रवासन रणनीति
हम पूरी तरह से माइग्रेट करना चाहते हैं Dagger
लेकिन Hilt
व्यावहारिक रूप से हमें एक वृद्धिशील दृष्टिकोण की आवश्यकता है जहां हम पहले अपनी app
परियोजना को Hilt
और फिर अन्य मॉड्यूल में माइग्रेट करेंगे, जिसका अर्थ है Dagger
और Hilt
कुछ समय के लिए समानांतर में काम करना चाहिए जब तक कि पूरा माइग्रेशन नहीं हो जाता।
संस्करणों
Dagger 2.24
यह कहानी से में प्रवास करेगी Hilt 2.45
।
संतुष्ट
- विन्यास/तैयारी
- ऐप घटक और सिंगलटन माइग्रेट करें
- आवेदन वर्ग माइग्रेट करें
- माइग्रेट गतिविधि वर्ग
- टुकड़े को माइग्रेट करें
- व्यूमॉडल माइग्रेट करें
- पोस्ट माइग्रेशन क्लीनअप
- सारांश और Takeaways
Hilt
ऐप ग्रैडल की build.gradle
फ़ाइल में निम्नलिखित निर्भरताओं को जोड़ने के लिए एकीकृत करने के लिए
फ़ाइल में kapt
correctErrorType को सेट करने के लिए भी कॉन्फ़िगर करेंtrue
build.gradle
dependencies {
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
correctErrorTypes = true
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android' version '2.45' apply false
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android'
}
android {
....
}
ऐप घटक माइग्रेट करें
डैगर में Singleton
Component
ऐप या प्रोजेक्ट के अन्य मॉड्यूल में बनाए गए सभी डैगर मॉड्यूल शामिल हैं और यह सामान्य रूप AppComponent
से Dagger
.
आइए वर्तमान AppComponent.kt फ़ाइल को देखें
माइग्रेट करने के लिए Singleton
Component
हमें प्रत्येक मॉड्यूल जैसे कि NetworkModule , StorageModule आदि को स्थापित करने की आवश्यकता है, आप उन सभी अलग-अलग मॉड्यूलों को एनोटेट करके ऐसा कर सकते हैं, लेकिन यदि आपके पास बहुत सारे मॉड्यूल हैं, तो उन सभी को एक साथ बदलना अच्छा विचार नहीं होगा, बल्कि आप कर सकते SingletonComponent
हैं एक समेकित मॉड्यूल बनाएं जिसे एनोटेट किया जाएगा और इन सभी मॉड्यूल को एनोटेट किया जाएगा ।Hilt
@InstallIn(SingletonComponent::class)
@InstallIn(SingletonComponent::class)
Dagger
@Module(includes = [ <all of these modules > ])
प्रोजेक्ट चलाएँ, यह एक त्रुटि उठाएगा
DisableModuleHasInstallInCheck त्रुटि
आपके द्वारा चलाए जाने के बाद प्रोजेक्ट प्रत्येक मॉड्यूल के लिए एनोटेशन Hilt
ढूंढने का प्रयास करेगा जो एनोटेट में शामिल है । एक त्रुटि उत्पन्न करेगा यदि उसे एक ऐसा मॉड्यूल मिलेगा जो एनोटेट नहीं किया गया है क्योंकि हमने प्रत्येक मॉड्यूल को एनोटेट नहीं किया है क्योंकि हम माइग्रेशन के बीच में हैं, हम निम्न फ़्लैग का उपयोग करके इस त्रुटि को अक्षम कर सकते हैं@InstallIn
AggregatedModule
@Module
Hilt
@Install
@InstallIn
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
build.gradle
आप नीचे के रूप में ऐप स्तर में निर्दिष्ट कर सकते हैं लेकिन सभी माइग्रेशन पूर्ण होने के बाद हमें इस ध्वज को हटा देना चाहिए।
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
आवेदन वर्ग माइग्रेट करें
एप्लिकेशन में हिल्ट जोड़ने के लिए, आइए Application
कक्षा को @HiltAndroidApp
. आपको हटा देना चाहिए @Component
और जो ऊपर बताए अनुसार कक्षा @Component.Builder
में मौजूद थे ।AppComponent
यदि आपका Application
विस्तार DaggerApplication
या लागू होता है, HasAndroidInjector
तो आपको इन दोनों मामलों में नीचे दिखाए गए अनुसार कुछ कोड रखने की आवश्यकता है। यह संपूर्ण प्रवासन पूरा होने तक दोनों Dagger
और समानांतर में समर्थन करने के लिए है।Hilt
यदि आपका आपके आवेदन वर्ग Application
से विस्तार होता है DaggerApplication
तो ऐसा दिखाई देगा।
और अगर आपका Application
इम्प्लीमेंट है HasAndroidInjector
तो आपका एप्लीकेशन इस तरह दिखना चाहिए
एक बार पूरा माइग्रेशन पूरा हो जाने के बाद आपको अपनी Application
कक्षा से इस तरह के कोड को हटाने की आवश्यकता होगी और आपका कोड Application
नीचे जैसा दिखेगा। (लेकिन यह अंतिम चरणों में से एक होगा, कृपया इसे अभी न करें)
प्रोजेक्ट को चलाएं, इसे सफलतापूर्वक आपकी परियोजना का निर्माण करना चाहिए और ऐप को रन टाइम अपवादों के बिना लॉन्च करना चाहिए।
माइग्रेट गतिविधि वर्ग
डैगर @ContributesAndroidInjector
एंड्रॉइड इंजेक्टर के लिए योगदानकर्ता के रूप में किसी भी गतिविधि/टुकड़े को निर्दिष्ट करने के लिए प्रदान करता है, जो हमारे प्रोजेक्ट में किया गया है MainActivityModule
, इसमें शामिल मॉड्यूल में से एकAggregatedModule
MainActivityModule
प्रवासन से पहले ऐसा दिखता है
MainActivity
प्रवासन से पहले ऐसा दिखता है
MainActivity
अपने को माइग्रेट करने के लिए Hilt
, हम पूरी तरह से मॉड्यूल वर्ग से छुटकारा पा लेंगे MainActivityModule
और @AndroidEntryPoint
इसके लिए एनोटेशन जोड़ देंगे MainActivity
। जैसा कि हमारा MainActivity
भी विस्तार हो रहा है, DaggerAppCompatActivity
हमें अपनी गतिविधि को संबंधित से विस्तारित करने की आवश्यकता है, AppCompatActivity
इसलिए प्रवासन के बाद हमारा MainActivity
नीचे जैसा दिखेगा।
अपना प्रोजेक्ट चलाएं इसे MainActivity
में माइग्रेट करके सफल होना चाहिएHilt
माइग्रेट फ्रैगमेंट/व्यू/ब्रॉडकास्ट रिसीवर
किसी भी फ़्रैगमेंट में माइग्रेट करना Hilt
उन्हीं चरणों से किया जाएगा जैसा हमने MainActivity
हिल्ट में माइग्रेट करने के लिए किया था। कदम नीचे हैं
- उस कोड को हटा दें जहां आप अपने फ्रैगमेंट को
@ContributesAndroidInjector
मॉड्यूल होने की संभावना के साथ एनोटेट कर रहे हैं - उस मॉड्यूल को हटा दें जिसमें से आपके फ्रैगमेंट को
SingletonComponent
हैंडल किया जा रहा था@ContributesAndroidInjector
- के साथ अपने फ्रैगमेंट को एनोटेट करें
@AndroidEntryPoint
- यदि आपका टुकड़ा
DaggerFragment
तब से बढ़ाया गया है, तो आपको अपने टुकड़े कोFragment
कक्षा से विस्तारित करने की आवश्यकता है
व्यूमॉडल माइग्रेट करें
ViewModel को माइग्रेट करने के लिए कुछ चरणों की आवश्यकता होती है।
सबसे पहले अपने viewModel को एनोटेट करें@HiltViewModel
FeatureViewModel
इंजेक्शन लगाने के लिए Hilt
हम फ्रैगमेंट एक्सटेंशन डिपेंडेंसी में प्रदान किए गए फ्रैगमेंट एक्सटेंशन का उपयोग करेंगे, जिसे हम नीचे दी गई संबंधित फाइल viewModels()
में जोड़ेंगेbuild.gradle
implementation "androidx.fragment:fragment-ktx:1.5.6"
अब संबंधित और बाइंडिंग को हटा दें @Bind
जिसके लिए हमने डैगर के लिए उपयोग किया था @IntoMap
।@ViewModelKey
FeatureViewModel
डैगर में एक व्यूमोडेल इंजेक्ट करने के लिए हमारे पास ऐसी संपत्ति भी होगी जो कुछ का उपयोग करके रनटाइम पर lateinit var
होगी, जिसकी अब आवश्यकता नहीं है, इसलिए आप हटा सकते हैं , और संबंधित कोड यदि डैगर पर कोई अन्य व्यूमोडेल/फ्रैगमेंट अभी भी नहीं है।injected
ViewModelFactory
ViewModelModule
ViewModelProviderFactory
अपना प्रोजेक्ट चलाएं इसे Fragment and ViewModel
में माइग्रेट करके सफल होना चाहिएHilt
अन्य मॉड्यूल माइग्रेट करें।
अब तक हम ऐप मॉड्यूल में /// Components
माइग्रेट कर रहे थे। लेकिन हमें अब अन्य मॉड्यूल को माइग्रेट करना होगा, हम एक समय में एक मॉड्यूल पर जाएंगे और निम्नलिखित चरणों का उपयोग करके इसे पूरी तरह से हिल्ट पर माइग्रेट करेंगेModules
Activity
Fragment
- मॉड्यूल की फ़ाइल
Hilt
में निर्भरता जोड़ेंbuild.gradle
- एनोटेशन
@Module
के साथ प्रत्येक को एनोटेट करें ।@InstallIn
@JvmStatic
यदि आपके पास है तो प्रत्येक एनोटेशन के लिए एनोटेशन निकालें@Provide
, क्योंकि इसमें अब इसकी आवश्यकता नहीं हैHilt
- अपने
Fragment
/ कोActivity
एनोटेट करें@AndroidEntryPoint
और संबंधित को हटा दें@ContributesAndroidInjector
- एनोटेट करने वाले अपने ViewModels को माइग्रेट करें
@HiltViewModel
औरviewModels()
उन व्यू मॉडल्स को इंजेक्ट करने के लिए फ़्रैगमेंट एक्सटेंशन का उपयोग करें - उन सभी मॉड्यूल को हटाते रहें जिनकी अब और आवश्यकता नहीं होगी
AggregatedModule
।AggregatedModule
हमने अपने पहले चरण में ऊपर बनाया है।
एक बार प्रत्येक प्रोजेक्ट मॉड्यूल को Hilt
. सफाई का समय चाहिए
- अक्षम करेंModuleInstallInCheck=true को हटाएं, जिसे हमने ऐप स्तर या किसी अन्य में शुरुआत में जोड़ा था
build.gradle
और@DisableInstallInCheck
एनोटेशन को हटा दिया था यदि इसे किसी में जोड़ा गया था@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Dagger
4. अपने सभी मॉड्यूल में सभी निर्भरताओं को हटा दें ।
Hilt
अपने प्रोजेक्ट को चलाएं इसे सफलतापूर्वक में माइग्रेट किए गए अपने प्रोजेक्ट को चलाना चाहिए
सारांश और Takeaways
माइग्रेशन के बाद कोड में बदलाव का हाई लेवल ओवरव्यू इस तरह दिखेगा
- सभी कोड एनोटेशन
@Component
////@Component.Builder
हटा दिए@Component.Factory
गए होंगे@ContributesAndroidInjector
@ViewModelKey
- आपके सभी व्यू मॉडल्स को एनोटेट किया जाना चाहिए
@HiltViewModel
- सभी वर्गों को एनोटेशन
@Module
के साथ एनोटेट किया जाना चाहिए@InstallIn
- टुकड़े/गतिविधियाँ/दृश्य/सेवा के साथ एनोटेट किया जाना चाहिए
@AndroidEntryPoint
- आवेदन वर्ग के साथ टिप्पणी की जानी चाहिए
@HiltAndroidApp
AppComponent
और संबंधित कोड को हटाया जाना चाहिए@JvmStatic
हिल्ट मॉड्यूल के अंदर एनोटेशन अब मौजूद नहीं होना चाहिए
- निर्भरता इंजेक्शन HILT का उपयोग कर
- आधिकारिक दस्तावेज़ीकरण के लिए माइग्रेट करें
अनुसरण करना याद रखें और यदि आपको यह पसंद आया :)
—————————————
गिटहब | लिंक्डइन | ट्विटर
लेवल अप कोडिंग
हमारे समुदाय का हिस्सा बनने के लिए धन्यवाद! इससे पहले कि तुम जाओ:
- कहानी के लिए ताली बजाएं और लेखक को फॉलो करें
- लेवल अप कोडिंग प्रकाशन में अधिक सामग्री देखें
- फ्री कोडिंग इंटरव्यू कोर्स ⇒ कोर्स देखें
- हमें फॉलो करें: ट्विटर | लिंक्डइन | समाचार पत्रिका