ایجاد ViewModelها به همراه وابستگی‌ها ، بخشی از Android Jetpack .

با پیروی از بهترین شیوه‌های تزریق وابستگی ، ViewModelها می‌توانند وابستگی‌ها را به عنوان پارامتر در سازنده خود دریافت کنند. این وابستگی‌ها عمدتاً از نوع دامنه یا لایه‌های داده هستند. از آنجا که چارچوب، ViewModelها را ارائه می‌دهد، برای ایجاد نمونه‌هایی از آنها به مکانیزم خاصی نیاز است. این مکانیزم رابط ViewModelProvider.Factory است. فقط پیاده‌سازی‌های این رابط می‌توانند ViewModelها را در محدوده مناسب نمونه‌سازی کنند .

ViewModelها با CreationExtras

اگر یک کلاس ViewModel در سازنده خود وابستگی دریافت می‌کند، یک factory ارائه دهید که رابط ViewModelProvider.Factory را پیاده‌سازی کند. تابع create(Class<T>, CreationExtras) را برای ارائه یک نمونه جدید از ViewModel بازنویسی کنید.

CreationExtras به شما امکان می‌دهد به اطلاعات مرتبطی که به نمونه‌سازی یک ViewModel کمک می‌کنند، دسترسی پیدا کنید. در اینجا لیستی از کلیدهایی که می‌توان از طریق extras به آنها دسترسی داشت، آورده شده است:

کلید عملکرد
ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY دسترسی به کلید سفارشی که به ViewModelProvider.get() ارسال کرده‌اید را فراهم می‌کند.
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY دسترسی به نمونه کلاس Application را فراهم می‌کند.
SavedStateHandleSupport.DEFAULT_ARGS_KEY دسترسی به Bundle آرگومان‌هایی را که باید برای ساخت SavedStateHandle استفاده کنید، فراهم می‌کند.
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY دسترسی به SavedStateRegistryOwner که برای ساخت ViewModel استفاده می‌شود را فراهم می‌کند.
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY دسترسی به ViewModelStoreOwner که برای ساخت ViewModel استفاده می‌شود را فراهم می‌کند.

برای ایجاد یک نمونه جدید از SavedStateHandle ، از تابع CreationExtras.createSavedStateHandle() استفاده کنید و آن را به ViewModel ارسال کنید.

CreationExtras با APPLICATION_KEY

در ادامه مثالی از نحوه ارائه نمونه‌ای از ViewModel آمده است که یک مخزن (repository) را که در محدوده کلاس 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 از این factory استفاده کنید:

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 ایجاد شده باشد و بنابراین به وابستگی‌های اندروید دسترسی نداشته باشد.

در این مثال، 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,
                )
            }
        }
    }
}

شما می‌توانید یک ViewModel با CreationExtras.Key مستقیماً در composable های خود نمونه‌سازی کنید.

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ها و وابستگی‌ها، به منابع اضافی زیر مراجعه کنید:

مستندات

محتوا را مشاهده می‌کند

{% کلمه به کلمه %} {% فعل کمکی %} {% کلمه به کلمه %} {% فعل کمکی %}