ایجاد 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ها و وابستگیها، به منابع اضافی زیر مراجعه کنید:
مستندات
محتوا را مشاهده میکند
{% کلمه به کلمه %}برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- ماژول وضعیت ذخیره شده برای ViewModel
- ذخیره حالتهای رابط کاربری