Bağımlılıklarla ViewModel'ler oluşturma Android Jetpack'in bir parçasıdır.
Bağımlılık ekleme ile ilgili en iyi uygulamalara uygun olarak, ViewModel'ler oluşturucularında bağımlılıkları parametre olarak alabilir. Bunlar çoğunlukla alan veya veri katmanlarındaki türlerdir. Çerçeve ViewModels'i sağladığından bunların örneklerini oluşturmak için özel bir mekanizma gerekir. Bu mekanizma ViewModelProvider.Factory arayüzüdür. Bu arayüzün yalnızca uygulamaları, ViewModels'i doğru kapsamda oluşturabilir.
CreationExtras ile ViewModels
Bir ViewModel sınıfının oluşturucusunda bağımlılıklar varsa ViewModelProvider.Factory arayüzünü uygulayan bir fabrika sağlayın.
ViewModel'in yeni bir örneğini sağlamak için create(Class<T>, CreationExtras) işlevini geçersiz kılın.
CreationExtras, ViewModel'in örneklendirilmesine yardımcı olan alakalı bilgilere erişmenizi sağlar. Ekstralardan erişilebilen tuşların listesini aşağıda bulabilirsiniz:
| Anahtar | Uygulama işlevi |
|---|---|
ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY |
ViewModelProvider.get()'ya ilettiğiniz özel anahtara erişim sağlar. |
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY |
Application sınıfının örneğine erişim sağlar. |
SavedStateHandleSupport.DEFAULT_ARGS_KEY |
SavedStateHandle oluşturmak için kullanmanız gereken bağımsız değişkenler grubuna erişim sağlar. |
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY |
ViewModel oluşturmak için kullanılan SavedStateRegistryOwner erişim sağlar. |
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY |
ViewModel oluşturmak için kullanılan ViewModelStoreOwner erişim sağlar. |
SavedStateHandle öğesinin yeni bir örneğini oluşturmak için CreationExtras.createSavedStateHandle() işlevini kullanın ve ViewModel'e iletin.
APPLICATION_KEY ile CreationExtras
Aşağıda, ViewModel sınıfı kapsamlı bir repository ve SavedStateHandle bağımlılıklarını alan bir ViewModel örneğinin nasıl sağlanacağına dair bir örnek verilmiştir:Application
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
)
}
}
}
}
Ardından, ViewModel örneğini alırken bu fabrikayı kullanabilirsiniz:
import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
modifier: Modifier = Modifier,
viewModel: MyViewModel = viewModel(factory = MyViewModel.Factory)
) {
// ...
}
Özel parametreleri CreationExtras olarak iletme
Özel bir anahtar oluşturarak ViewModel aracılığıyla CreationExtras öğenize bağımlılıklar iletebilirsiniz.
Bu, ViewModel öğenizin Application sınıfı ve APPLICATION_KEY üzerinden erişilemeyen nesnelere bağlı olduğu durumlarda faydalı olabilir. Bunun bir örneği, ViewModel öğenizin Kotlin Multiplatform modülünde oluşturulması ve bu nedenle Android bağımlılıklarına erişememesidir.
Bu örnekte ViewModel, özel bir anahtar tanımlar ve bunu ViewModelProvider.Factory içinde kullanır.
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,
)
}
}
}
}
Doğrudan composable'larınızda CreationExtras.Key ile ViewModel oluşturabilirsiniz.
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,
)
}
Ek kaynaklar
ViewModel'ler ve bağımlılıklar hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:
Belgeler
İçeriği görüntüleme
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- ViewModel için Saved State modülü
- Kullanıcı arayüzü durumlarını kaydetme