मल्टी मॉड्यूल प्रोजेक्ट में डैगर2 से हिल्ट में माइग्रेट करें

May 10 2023
मल्टी मॉड्यूल प्रोजेक्ट में डैगर से हिल्ट में माइग्रेट करने के लिए चरण दर चरण गाइड। परियोजना संरचना परियोजना की कल्पना करने के लिए, इसमें कई मॉड्यूल शामिल हैं NetworkModule, StorageModule, CommonModule, FeatureModule आदि।

बहु-मॉड्यूल परियोजना में Daggerसे में माइग्रेट करने के लिए चरण-दर-चरण मार्गदर्शिका ।Hilt

अनस्प्लैश पर सैफ71.कॉम द्वारा फोटो

परियोजना संरचना

परियोजना की कल्पना करने के लिए, इसमें कई मॉड्यूल शामिल हैं NetworkModule, StorageModule, CommonModule, FeatureModule आदि। वास्तविक परियोजनाओं में कई और मॉड्यूल हो सकते हैं लेकिन हम निम्नलिखित मॉड्यूल तक सीमित हैं।

प्रवासन रणनीति

हम पूरी तरह से माइग्रेट करना चाहते हैं Daggerलेकिन Hiltव्यावहारिक रूप से हमें एक वृद्धिशील दृष्टिकोण की आवश्यकता है जहां हम पहले अपनी appपरियोजना को Hiltऔर फिर अन्य मॉड्यूल में माइग्रेट करेंगे, जिसका अर्थ है Daggerऔर Hiltकुछ समय के लिए समानांतर में काम करना चाहिए जब तक कि पूरा माइग्रेशन नहीं हो जाता।

संस्करणों

Dagger 2.24यह कहानी से में प्रवास करेगी Hilt 2.45

संतुष्ट

  • विन्यास/तैयारी
  • ऐप घटक और सिंगलटन माइग्रेट करें
  • आवेदन वर्ग माइग्रेट करें
  • माइग्रेट गतिविधि वर्ग
  • टुकड़े को माइग्रेट करें
  • व्यूमॉडल माइग्रेट करें
  • पोस्ट माइग्रेशन क्लीनअप
  • सारांश और Takeaways

Hiltऐप ग्रैडल की build.gradleफ़ाइल में निम्नलिखित निर्भरताओं को जोड़ने के लिए एकीकृत करने के लिए

फ़ाइल में kaptcorrectErrorType को सेट करने के लिए भी कॉन्फ़िगर करेंtruebuild.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ढूंढने का प्रयास करेगा जो एनोटेट में शामिल है । एक त्रुटि उत्पन्न करेगा यदि उसे एक ऐसा मॉड्यूल मिलेगा जो एनोटेट नहीं किया गया है क्योंकि हमने प्रत्येक मॉड्यूल को एनोटेट नहीं किया है क्योंकि हम माइग्रेशन के बीच में हैं, हम निम्न फ़्लैग का उपयोग करके इस त्रुटि को अक्षम कर सकते हैं@InstallInAggregatedModule@ModuleHilt@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हिल्ट में माइग्रेट करने के लिए किया था। कदम नीचे हैं

  1. उस कोड को हटा दें जहां आप अपने फ्रैगमेंट को @ContributesAndroidInjectorमॉड्यूल होने की संभावना के साथ एनोटेट कर रहे हैं
  2. उस मॉड्यूल को हटा दें जिसमें से आपके फ्रैगमेंट को SingletonComponentहैंडल किया जा रहा था@ContributesAndroidInjector
  3. के साथ अपने फ्रैगमेंट को एनोटेट करें@AndroidEntryPoint
  4. यदि आपका टुकड़ा DaggerFragmentतब से बढ़ाया गया है, तो आपको अपने टुकड़े को Fragmentकक्षा से विस्तारित करने की आवश्यकता है

व्यूमॉडल माइग्रेट करें

ViewModel को माइग्रेट करने के लिए कुछ चरणों की आवश्यकता होती है।

सबसे पहले अपने viewModel को एनोटेट करें@HiltViewModel

FeatureViewModelइंजेक्शन लगाने के लिए Hiltहम फ्रैगमेंट एक्सटेंशन डिपेंडेंसी में प्रदान किए गए फ्रैगमेंट एक्सटेंशन का उपयोग करेंगे, जिसे हम नीचे दी गई संबंधित फाइल viewModels()में जोड़ेंगेbuild.gradle

implementation "androidx.fragment:fragment-ktx:1.5.6"

अब संबंधित और बाइंडिंग को हटा दें @Bindजिसके लिए हमने डैगर के लिए उपयोग किया था @IntoMap@ViewModelKeyFeatureViewModel

डैगर में एक व्यूमोडेल इंजेक्ट करने के लिए हमारे पास ऐसी संपत्ति भी होगी जो कुछ का उपयोग करके रनटाइम पर lateinit varहोगी, जिसकी अब आवश्यकता नहीं है, इसलिए आप हटा सकते हैं , और संबंधित कोड यदि डैगर पर कोई अन्य व्यूमोडेल/फ्रैगमेंट अभी भी नहीं है।injectedViewModelFactoryViewModelModuleViewModelProviderFactory

अपना प्रोजेक्ट चलाएं इसे Fragment and ViewModelमें माइग्रेट करके सफल होना चाहिएHilt

अन्य मॉड्यूल माइग्रेट करें।

अब तक हम ऐप मॉड्यूल में /// Componentsमाइग्रेट कर रहे थे। लेकिन हमें अब अन्य मॉड्यूल को माइग्रेट करना होगा, हम एक समय में एक मॉड्यूल पर जाएंगे और निम्नलिखित चरणों का उपयोग करके इसे पूरी तरह से हिल्ट पर माइग्रेट करेंगेModulesActivityFragment

  1. मॉड्यूल की फ़ाइल Hiltमें निर्भरता जोड़ेंbuild.gradle
  2. एनोटेशन @Moduleके साथ प्रत्येक को एनोटेट करें ।@InstallIn
  3. @JvmStaticयदि आपके पास है तो प्रत्येक एनोटेशन के लिए एनोटेशन निकालें @Provide, क्योंकि इसमें अब इसकी आवश्यकता नहीं हैHilt
  4. अपने Fragment/ को Activityएनोटेट करें @AndroidEntryPointऔर संबंधित को हटा दें@ContributesAndroidInjector
  5. एनोटेट करने वाले अपने ViewModels को माइग्रेट करें @HiltViewModelऔर viewModels()उन व्यू मॉडल्स को इंजेक्ट करने के लिए फ़्रैगमेंट एक्सटेंशन का उपयोग करें
  6. उन सभी मॉड्यूल को हटाते रहें जिनकी अब और आवश्यकता नहीं होगी AggregatedModuleAggregatedModule हमने अपने पहले चरण में ऊपर बनाया है।

एक बार प्रत्येक प्रोजेक्ट मॉड्यूल को Hilt. सफाई का समय चाहिए

  1. अक्षम करेंModuleInstallInCheck=true को हटाएं, जिसे हमने ऐप स्तर या किसी अन्य में शुरुआत में जोड़ा था build.gradleऔर @DisableInstallInCheckएनोटेशन को हटा दिया था यदि इसे किसी में जोड़ा गया था@Module
  2. defaultConfig {
       
        //TODO: remove this after migration to Hilt
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
            }
        }
    }
    

Dagger4. अपने सभी मॉड्यूल में सभी निर्भरताओं को हटा दें ।

Hilt अपने प्रोजेक्ट को चलाएं इसे सफलतापूर्वक में माइग्रेट किए गए अपने प्रोजेक्ट को चलाना चाहिए

सारांश और Takeaways

माइग्रेशन के बाद कोड में बदलाव का हाई लेवल ओवरव्यू इस तरह दिखेगा

  1. सभी कोड एनोटेशन @Component//// @Component.Builderहटा दिए @Component.Factoryगए होंगे@ContributesAndroidInjector@ViewModelKey
  2. आपके सभी व्यू मॉडल्स को एनोटेट किया जाना चाहिए@HiltViewModel
  3. सभी वर्गों को एनोटेशन @Moduleके साथ एनोटेट किया जाना चाहिए@InstallIn
  4. टुकड़े/गतिविधियाँ/दृश्य/सेवा के साथ एनोटेट किया जाना चाहिए@AndroidEntryPoint
  5. आवेदन वर्ग के साथ टिप्पणी की जानी चाहिए@HiltAndroidApp
  6. AppComponentऔर संबंधित कोड को हटाया जाना चाहिए
  7. @JvmStaticहिल्ट मॉड्यूल के अंदर एनोटेशन अब मौजूद नहीं होना चाहिए
  • निर्भरता इंजेक्शन HILT का उपयोग कर
  • आधिकारिक दस्तावेज़ीकरण के लिए माइग्रेट करें

अनुसरण करना याद रखें और यदि आपको यह पसंद आया :)

—————————————

गिटहब | लिंक्डइन | ट्विटर

लेवल अप कोडिंग

हमारे समुदाय का हिस्सा बनने के लिए धन्यवाद! इससे पहले कि तुम जाओ:

  • कहानी के लिए ताली बजाएं और लेखक को फॉलो करें
  • लेवल अप कोडिंग प्रकाशन में अधिक सामग्री देखें
  • फ्री कोडिंग इंटरव्यू कोर्स ⇒ कोर्स देखें
  • हमें फॉलो करें: ट्विटर | लिंक्डइन | समाचार पत्रिका