إنشاء نماذج العرض مع التبعيات جزء من Android Jetpack.
باتّباع أفضل ممارسات إدخال التبعيات، يمكن أن تأخذ نماذج العرض التبعيات كمعلّمات في الدالة الإنشائية. وتكون هذه التبعيات في الغالب من أنواع
من طبقتَي النطاق أو البيانات. بما أنّ الإطار يوفّر نماذج العرض، يلزم توفير آلية خاصة لإنشاء مثيلاتها. هذه الآلية هي واجهة ViewModelProvider.Factory. لا يمكن إلا لعمليات تنفيذ هذه الواجهة إنشاء نماذج العرض في النطاق المناسب.
نماذج العرض مع CreationExtras
إذا كانت فئة ViewModel تتلقّى تبعيات في الدالة الإنشائية، عليك توفير مصنع ينفّذ واجهة ViewModelProvider.Factory.
عليك إلغاء الدالة create(Class<T>, CreationExtras) لتوفير مثيل جديد من ViewModel.
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 |
يوفّر إمكانية الوصول إلى SavedStateRegistryOwner المستخدَم لإنشاء ViewModel. |
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY |
يوفّر إمكانية الوصول إلى ViewModelStoreOwner المستخدَم لإنشاء ViewModel. |
لإنشاء مثيل جديد من SavedStateHandle، استخدِم
CreationExtras.createSavedStateHandle()
الدالة ومرِّرها إلى ViewModel.
CreationExtras مع APPLICATION_KEY
في ما يلي مثال على كيفية توفير مثيل من 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
يمكنك تمرير التبعيات إلى ViewModel من خلال CreationExtras عن طريق إنشاء مفتاح مخصّص.
قد يكون ذلك مفيدًا إذا كان 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,
)
}
}
}
}
يمكنك إنشاء مثيل من ViewModel باستخدام CreationExtras.Key مباشرةً في العناصر القابلة للإنشاء.
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,
)
}
مراجع إضافية
لمزيد من المعلومات عن نماذج العرض والتبعيات، اطّلِع على المراجع الإضافية التالية:
الوثائق
محتوى المشاهدات
مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما يكون JavaScript غير مفعّل
- وحدة "الحالة المحفوظة" لـ ViewModel
- حفظ حالات واجهة المستخدم