অন্যান্য Jetpack লাইব্রেরির সাথে Hilt ব্যবহার করা

অন্যান্য Jetpack লাইব্রেরি থেকে ক্লাস প্রদান করার জন্য Hilt-এ এক্সটেনশন অন্তর্ভুক্ত থাকে। Hilt বর্তমানে নিম্নলিখিত Jetpack কম্পোনেন্ট সাপোর্ট করে:

  • লিখুন
  • ViewModel
  • নেভিগেশন
  • WorkManager

এইসব ইন্টিগ্রেশনের সুবিধা নিতে আপনাকে অবশ্যই Hilt ডিপেন্ডেন্সি যোগ করতে হবে। ডিপেনডেন্সি যোগ করা সম্পর্কে আরও তথ্যের জন্য, Hilt-এর সাথে ডিপেনডেন্সি ইনজেকশন দেখুন।

Jetpack Compose-এর সাথে ইন্টিগ্রেশন

Hilt কীভাবে Jetpack Compose-এর সাথে ইন্টিগ্রেট করে তা দেখতে, Compose ও অন্যান্য লাইব্রেরি-এর Hilt বিভাগ দেখুন।

Hilt-এর সাহায্যে ViewModel অবজেক্ট ইনজেক্ট করা

@HiltViewModel দিয়ে অ্যানোটেট করে এবং ViewModel অবজেক্টের কনস্ট্রাক্টরে @Inject অ্যানোটেশন ব্যবহার করে একটি ViewModel প্রদান করুন।

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

তারপর, @AndroidEntryPoint দিয়ে অ্যানোটেট করা অ্যাক্টিভিটি ViewModelProvider বা by viewModels() KTX এক্সটেনশন ব্যবহার করে স্বাভাবিকভাবে ViewModel ইনস্ট্যান্স পেতে পারে:

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

ViewModels-এর সাথে অ্যাসিস্টেড ইনজেকশন ব্যবহার করা

Hilt, ViewModels-এর জন্য অ্যাসিস্টেড ইনজেকশন সাপোর্ট করে। অ্যাসিস্টেড ইনজেকশন আপনাকে Hilt-ম্যানেজড ডিপেনডেন্সির পাশাপাশি ডায়নামিক রানটাইম আর্গুমেন্ট ইনজেক্ট করতে দেয়। অ্যাসিস্টেড ইনজেকশন ব্যবহার করতে, @AssistedInject-এর মাধ্যমে আপনার ViewModel কনস্ট্রাক্টর অ্যানোটেট করুন এবং @Assisted-এর মাধ্যমে ডায়নামিক প্যারামিটার চিহ্নিত করুন। এছাড়াও, আপনাকে একটি @AssistedFactory ইন্টারফেস সংজ্ঞায়িত করতে হবে, যা Hilt-এর জন্য প্রয়োজনীয় @ViewModelProvider.Factory অটোমেটিক তৈরি করার জন্য একটি ব্রিজ হিসেবে কাজ করে।

@HiltViewModel(assistedFactory = MyViewModel.Factory::class)
class MyViewModel @AssistedInject constructor(
    @Assisted val userId: String,
    private val repository: MyRepository
) : ViewModel() {
    @AssistedFactory interface Factory {
        fun create(userId: String): MyViewModel
    }
}

Compose-এ, আপনি নেভিগেশন বা স্ক্রিন ইনিশিয়ালাইজেশনের সময় hiltViewModel ফাংশনে পাস করে অ্যাসিস্টেড ফ্যাক্টরি ব্যবহার করতে পারেন। এই পদ্ধতিটি ম্যানুয়াল ফ্যাক্টরি বয়লারপ্লেটের প্রয়োজনীয়তা দূর করে এবং আপনার ViewModel-কে নেভিগেশন ব্যাক স্ট্যাকের সাথে সঠিকভাবে স্কোপ করে। আরও তথ্যের জন্য, অ্যাসিস্টেড ইনজেকশন-এ Hilt ডকুমেন্টেশন দেখুন।

@ViewModelScoped

সব Hilt ViewModel, ViewModelComponent-এর মাধ্যমে প্রদান করা হয় যা ViewModel-এর মতো একই লাইফসাইকেল অনুসরণ করে এবং সেই কারণে কনফিগারেশন পরিবর্তন হলেও টিকে থাকতে পারে। ViewModel-এ ডিপেন্ডেন্সি স্কোপ করতে @ViewModelScoped অ্যানোটেশন ব্যবহার করুন।

@ViewModelScoped টাইপ এটি এমনভাবে তৈরি করবে যাতে স্কোপড টাইপের একটি ইনস্ট্যান্স ViewModel-এ ইনজেক্ট করা সমস্ত ডিপেন্ডেন্সি জুড়ে প্রদান করা হয়। ViewModel-এর অন্যান্য ইনস্ট্যান্স যা স্কোপ করা ইনস্ট্যান্সের জন্য অনুরোধ করে, সেটি অন্য ইনস্ট্যান্স পাবে।

বিভিন্ন ViewModel জুড়ে একটি ইনস্ট্যান্স শেয়ার করতে হলে, @ActivityRetainedScoped বা @Singleton ব্যবহার করে এটির স্কোপ নির্ধারণ করতে হবে।

Jetpack নেভিগেশন লাইব্রেরির সাথে ইন্টিগ্রেশন

আপনার Gradle ফাইলে নিম্নলিখিত অতিরিক্ত ডিপেন্ডেন্সি যোগ করুন:

app/build.gradle

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0")
}

গ্ৰুভি

dependencies {
    ...
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0'
}

Jetpack Compose-এ, Navigation Compose এবং Navigation 3 লাইব্রেরি উভয়ই বর্তমান নেভিগেশন গন্তব্যে স্কোপ করা ViewModel অটোমেটিক ফিরিয়ে আনতে hiltViewModel ফাংশন ব্যবহার করে।

নেভিগেশন ৩-এ, নেভিগেশন গন্তব্য NavEntry দ্বারা দেখানো হয়। rememberViewModelStoreNavEntryDecorator ব্যবহার করে NavEntry-এViewModel-এর স্কোপ নির্ধারণ করুন। সংশ্লিষ্ট ViewModel ফিরিয়ে আনতে, NavEntry-এর জন্য প্রোভাইডারের মধ্যে hiltViewModel ব্যবহার করুন।

NavDisplay(...,
  entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()),
  entryProvider = entryProvider {
    entry { key ->
      val viewModel = hiltViewModel()
      MyScreen(viewModel = viewModel)
    }
  }
)

Navigation Compose-এ, ViewModels অটোমেটিক নেভিগেশন ডেস্টিনেশনে স্কোপ করা হয়। আরও তথ্যের জন্য, Hilt ও নেভিগেশন দেখুন।

val viewModel = hiltViewModel()

Hilt-এর মাধ্যমে WorkManager ইনজেক্ট করা

আপনার Gradle ফাইলে নিম্নলিখিত অতিরিক্ত ডিপেন্ডেন্সি যোগ করুন। মনে রাখবেন যে লাইব্রেরি ছাড়াও, আপনাকে একটি অতিরিক্ত অ্যানোটেশন প্রসেসর অন্তর্ভুক্ত করতে হবে যা হিল্ট অ্যানোটেশন প্রসেসরের উপরে কাজ করে:

app/build.gradle

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    ksp("androidx.hilt:hilt-compiler:1.4.0")
}

গ্ৰুভি

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  ksp 'androidx.hilt:hilt-compiler:1.4.0'
}

ক্লাসে @HiltWorker অ্যানোটেশন এবং Worker অবজেক্টের কনস্ট্রাক্টরে @AssistedInject ব্যবহার করে Worker ইনজেক্ট করুন। আপনি Worker অবজেক্টে শুধুমাত্র @Singleton বা আনস্কোপড বাইন্ডিং ব্যবহার করতে পারবেন। এছাড়াও, আপনাকে @Assisted-এর সাথে Context এবং WorkerParameters ডিপেন্ডেন্সি অ্যানোটেট করতে হবে:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

তারপর, আপনার Application ক্লাসকে Configuration.Provider ইন্টারফেস প্রয়োগ করতে দিন, HiltWorkFactory-এর একটি ইনস্ট্যান্স ইনজেক্ট করুন এবং নিচে উল্লেখ করা পদ্ধতি অনুযায়ী WorkManager কনফিগারেশনে এটি পাস করুন:

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}