Hilt কোড জেনারেশনের জন্য Hilt ব্যবহার করে এমন সব Gradle মডিউলে অ্যাক্সেস প্রয়োজন। যে Gradle মডিউল আপনার
Application ক্লাস কম্পাইল করে, সেটির ট্রানজিটিভ ডিপেন্ডেন্সিতে সব Hilt
মডিউল এবং কন্সট্রাক্টর-ইনজেক্টেড ক্লাস থাকতে হবে।
আপনার মাল্টি-মডিউল প্রোজেক্ট যদি সাধারণ Gradle মডিউল দিয়ে তৈরি হয়, তাহলে আপনি Hilt-এর সাথে ডিপেন্ডেন্সি ইনজেকশন-এ যেভাবে বর্ণনা করা হয়েছে সেভাবে Hilt ব্যবহার করতে পারবেন। তবে, ফিচার মডিউল অন্তর্ভুক্ত আছে এমন অ্যাপের ক্ষেত্রে এটি প্রযোজ্য নয়।
ফিচার মডিউলে Hilt
ফিচার মডিউলে, মডিউলগুলি সাধারণত যেভাবে একে অপরের উপর নির্ভর করে তা উল্টে যায়। তাই, Hilt ফিচার মডিউলে অ্যানোটেশন প্রসেস করতে পারে না। আপনার ফিচার মডিউলে ডিপেন্ডেন্সি ইনজেকশন পারফর্ম করতে আপনাকে অবশ্যই Dagger ব্যবহার করতে হবে।
ফিচার মডিউলের সাথে এই সমস্যার সমাধান করতে আপনাকে অবশ্যই কম্পোনেন্ট ডিপেন্ডেন্সি ব্যবহার করতে হবে। এইসব ধাপ অনুসরণ করুন:
- ফিচার মডিউলের জন্য প্রয়োজনীয় ডিপেন্ডেন্সি সহ
appমডিউলে (বা Hilt-এর মাধ্যমে প্রসেস করা যায় এমন অন্য কোনও মডিউলে) একটি@EntryPointইন্টারফেস ঘোষণা করুন। @EntryPointইন্টারফেসের উপর নির্ভর করে এমন একটি ড্যাগার কম্পোনেন্ট তৈরি করো।- ফিচার মডিউলে স্বাভাবিকভাবে Dagger ব্যবহার করুন।
Hilt-এর সাথে ডিপেন্ডেন্সি ইনজেকশন পৃষ্ঠা থেকে উদাহরণটি বিবেচনা করুন। ধরুন, আপনি প্রোজেক্টে
login ফিচার মডিউল যোগ করেছেন। আপনি LoginActivity নামক অ্যাক্টিভিটির মাধ্যমে
লগ-ইন ফিচার প্রয়োগ করেন। এর অর্থ হল, আপনি শুধুমাত্র অ্যাপ্লিকেশন কম্পোনেন্ট থেকে
বাইন্ডিং পেতে পারেন।
এই ফিচারের জন্য, আপনার authInterceptor বাইন্ডিং সহ OkHttpClient প্রয়োজন।
প্রথমে, login মডিউলের জন্য প্রয়োজনীয় বাইন্ডিং সহ
SingletonComponent-এ ইনস্টল করা একটি @EntryPoint ইন্টারফেস তৈরি করুন:
Kotlin
// LoginModuleDependencies.kt - File in the app module. @EntryPoint @InstallIn(SingletonComponent::class) interface LoginModuleDependencies { @AuthInterceptorOkHttpClient fun okHttpClient(): OkHttpClient }
জাভা
// LoginModuleDependencies.java - File in the app module. @EntryPoint @InstallIn(SingletonComponent.class) public interface LoginModuleDependencies { @AuthInterceptorOkHttpClient OkHttpClient okHttpClient(); }
LoginActivity-এ ফিল্ড ইনজেকশন পারফর্ম করতে, @EntryPoint ইন্টারফেসের উপর নির্ভর করে এমন একটি Dagger
কম্পোনেন্ট তৈরি করুন:
Kotlin
// LoginComponent.kt - File in the login module. @Component(dependencies = [LoginModuleDependencies::class]) interface LoginComponent { fun inject(activity: LoginActivity) @Component.Builder interface Builder { fun context(@BindsInstance context: Context): Builder fun appDependencies(loginModuleDependencies: LoginModuleDependencies): Builder fun build(): LoginComponent } }
জাভা
// LoginComponent.java - File in the login module. @Component(dependencies = LoginModuleDependencies.class) public interface LoginComponent { void inject(LoginActivity loginActivity); @Component.Builder interface Builder { Builder context(@BindsInstance Context context); Builder appDependencies(LoginModuleDependencies loginModuleDependencies); LoginComponent build(); } }
এইসব ধাপ সম্পূর্ণ হয়ে গেলে, আপনার ফিচার মডিউলে স্বাভাবিকভাবে Dagger ব্যবহার করুন। যেমন, আপনি SingletonComponent থেকে বাইন্ডিংকে কোনও ক্লাসের
ডিপেন্ডেন্সি হিসেবে ব্যবহার করতে পারেন:
Kotlin
// LoginAnalyticsAdapter.kt - File in the login module. class LoginAnalyticsAdapter @Inject constructor( @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient ) { ... }
জাভা
// LoginAnalyticsAdapter.java - File in the login module. public class LoginAnalyticsAdapter { private final OkHttpClient okHttpClient; @Inject LoginAnalyticsAdapter( @AuthInterceptorOkHttpClient OkHttpClient okHttpClient ) { this.okHttpClient = okHttpClient; } ... }
ফিল্ড ইনজেকশন পারফর্ম করতে, SingletonComponent ডিপেন্ডেন্সি পেতে applicationContext ব্যবহার করে
Dagger কম্পোনেন্টের ইনস্ট্যান্স তৈরি করুন:
Kotlin
// LoginActivity.kt - File in the login module. class LoginActivity : AppCompatActivity() { @Inject lateinit var loginAnalyticsAdapter: LoginAnalyticsAdapter override fun onCreate(savedInstanceState: Bundle?) { DaggerLoginComponent.builder() .context(this) .appDependencies( EntryPointAccessors.fromApplication( applicationContext, LoginModuleDependencies::class.java ) ) .build() .inject(this) super.onCreate(savedInstanceState) ... } }
জাভা
// LoginActivity.java - File in the login module. public class LoginActivity extends AppCompatActivity { @Inject LoginAnalyticsAdapter loginAnalyticsAdapter; @Override protected void onCreate(Bundle savedInstanceState) { DaggerLoginComponent.builder() .context(this) .appDependencies( EntryPointAccessors.fromApplication( getApplicationContext(), LoginModuleDependencies.class ) ) .build() .inject(this); super.onCreate(savedInstanceState); ... } }
ফিচার মডিউলে মডিউল ডিপেন্ডেন্সি সম্পর্কে আরও জানতে, ফিচার মডিউলের সাথে কম্পোনেন্ট ডিপেন্ডেন্সি দেখুন।
Android-এ Dagger সম্পর্কে আরও তথ্যের জন্য, Android অ্যাপে Dagger ব্যবহার করা দেখুন।