ডিপেন্ডেন্সি সহ ভিউমডেল তৈরি করুন , যা অ্যান্ড্রয়েড জেটপ্যাকের একটি অংশ।

ডিপেন্ডেন্সি ইনজেকশনের সেরা অনুশীলন অনুসরণ করে, ভিউমডেলগুলো তাদের কনস্ট্রাক্টরে প্যারামিটার হিসেবে ডিপেন্ডেন্সি গ্রহণ করতে পারে। এগুলো বেশিরভাগই ডোমেইন বা ডেটা লেয়ারের টাইপের হয়ে থাকে। যেহেতু ফ্রেমওয়ার্ক ভিউমডেলগুলো সরবরাহ করে, তাই সেগুলোর ইনস্ট্যান্স তৈরি করার জন্য একটি বিশেষ পদ্ধতির প্রয়োজন হয়। সেই পদ্ধতিটি হলো ViewModelProvider.Factory ইন্টারফেস। শুধুমাত্র এই ইন্টারফেসের ইমপ্লিমেন্টেশনগুলোই সঠিক স্কোপে ভিউমডেল ইনস্ট্যানশিয়েট করতে পারে

ক্রিয়েশনএক্সট্রাস সহ ভিউমডেল

যদি কোনো ViewModel ক্লাস তার কনস্ট্রাক্টরে ডিপেন্ডেন্সি গ্রহণ করে, তাহলে ViewModelProvider.Factory ইন্টারফেস ইমপ্লিমেন্ট করে এমন একটি ফ্যাক্টরি প্রদান করুন। ViewModel-এর একটি নতুন ইনস্ট্যান্স প্রদান করতে create(Class<T>, CreationExtras) ফাংশনটি ওভাররাইড করুন।

CreationExtras আপনাকে এমন প্রাসঙ্গিক তথ্য অ্যাক্সেস করার সুযোগ দেয় যা একটি ViewModel ইনস্ট্যানশিয়েট করতে সাহায্য করে। নিচে সেইসব কী-গুলোর একটি তালিকা দেওয়া হলো যা এক্সট্রাস থেকে অ্যাক্সেস করা যায়:

চাবি কার্যকারিতা
ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY ViewModelProvider.get() -এ আপনার দেওয়া কাস্টম কী-তে অ্যাক্সেস প্রদান করে।
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY Application ক্লাসের ইনস্ট্যান্সে প্রবেশাধিকার প্রদান করে।
SavedStateHandleSupport.DEFAULT_ARGS_KEY SavedStateHandle তৈরি করার জন্য প্রয়োজনীয় আর্গুমেন্টের বান্ডেলটি অ্যাক্সেস করার সুযোগ দেয়।
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY ViewModel তৈরি করতে ব্যবহৃত SavedStateRegistryOwner এ অ্যাক্সেস প্রদান করে।
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY ViewModel তৈরি করতে ব্যবহৃত ViewModelStoreOwner এ অ্যাক্সেস প্রদান করে।

SavedStateHandle এর একটি নতুন ইনস্ট্যান্স তৈরি করতে, CreationExtras.createSavedStateHandle() ফাংশনটি ব্যবহার করুন এবং এটিকে ViewModel-এ পাস করুন।

APPLICATION_KEY সহ CreationExtras

নিম্নলিখিতটি একটি ViewModel এর ইনস্ট্যান্স প্রদানের একটি উদাহরণ, যা ডিপেন্ডেন্সি হিসেবে Application ক্লাসের স্কোপে থাকা একটি রিপোজিটরি এবং SavedStateHandle গ্রহণ করে:

    import androidx.lifecycle.SavedStateHandle
    import androidx.lifecycle.ViewModel
    import androidx.lifecycle.ViewModelProvider
    import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.APPLICATION_KEY
    import androidx.lifecycle.createSavedStateHandle
    import androidx.lifecycle.viewmodel.initializer
    import androidx.lifecycle.viewmodel.viewModelFactory

    class MyViewModel(
        private val myRepository: MyRepository,
        private val savedStateHandle: SavedStateHandle
    ) : ViewModel() {

        // ViewModel logic
        // ...

        // Define ViewModel factory in a companion object
        companion object {

            val Factory: ViewModelProvider.Factory = viewModelFactory {
                initializer {
                    val savedStateHandle = createSavedStateHandle()
                    val myRepository = (this[APPLICATION_KEY] as MyApplication).myRepository
                    MyViewModel(
                        myRepository = myRepository,
                        savedStateHandle = savedStateHandle
                    )
                }
            }
        }
    }

তারপর, ViewModel-এর একটি ইনস্ট্যান্স পুনরুদ্ধার করার সময় আপনি এই ফ্যাক্টরিটি ব্যবহার করতে পারেন:

import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun MyScreen(
    modifier: Modifier = Modifier,
    viewModel: MyViewModel = viewModel(factory = MyViewModel.Factory)
) {
    // ...
}

কাস্টম প্যারামিটারগুলোকে CreationExtras হিসেবে পাস করুন

আপনি একটি কাস্টম কী তৈরি করে CreationExtras মাধ্যমে আপনার ViewModel এ ডিপেন্ডেন্সি পাস করতে পারেন। এটি তখন কাজে আসতে পারে যখন আপনার ViewModel এমন সব অবজেক্টের উপর নির্ভর করে, যেগুলো Application ক্লাস এবং APPLICATION_KEY মাধ্যমে অ্যাক্সেসযোগ্য নয়। এর একটি উদাহরণ হলো যখন আপনার ViewModel একটি Kotlin Multiplatform মডিউলের ভিতরে তৈরি করা হয় এবং সেই কারণে Android ডিপেন্ডেন্সিগুলোতে তার অ্যাক্সেস থাকে না।

এই উদাহরণে, ViewModel একটি কাস্টম কী সংজ্ঞায়িত করে এবং ViewModelProvider.Factory তে সেটি ব্যবহার করে।

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory

class MyViewModel(
    private val myRepository: MyRepository,
) : ViewModel() {
    // ViewModel logic

    // Define ViewModel factory in a companion object
    companion object {

        // Define a custom key using the factory function
        val MY_REPOSITORY_KEY = CreationExtras.Key<MyRepository>()

        val Factory: ViewModelProvider.Factory = viewModelFactory {
            initializer {
                // Get the dependency in your factory
                val myRepository = this[MY_REPOSITORY_KEY] as MyRepository
                MyViewModel(
                    myRepository = myRepository,
                )
            }
        }
    }
}

আপনি আপনার কম্পোজেবলগুলিতে সরাসরি CreationExtras.Key ব্যবহার করে একটি ViewModel ইনস্ট্যানশিয়েট করতে পারেন।

import androidx.lifecycle.viewmodel.MutableCreationExtras
import androidx.lifecycle.viewmodel.compose.viewModel
// ...
@Composable
fun MyApp(myRepository: MyRepository) {
    val extras = MutableCreationExtras().apply {
        set(MyViewModel.MY_REPOSITORY_KEY, myRepository)
    }
    val viewModel: MyViewModel = viewModel(
        factory = MyViewModel.Factory,
        extras = extras,
    )
}

অতিরিক্ত সম্পদ

ViewModel এবং এর নির্ভরতা সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত উৎসগুলো দেখুন:

ডকুমেন্টেশন

বিষয়বস্তু দেখুন

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}