종속 항목이 있는 ViewModel 만들기 Android Jetpack의 구성요소
종속 항목 삽입의 권장사항에 따라 ViewModel은 종속 항목을 생성자의 매개변수로 사용할 수 있습니다. 이는 대부분 도메인 또는 데이터 레이어의 유형입니다. 프레임워크에서 ViewModel을 제공하기 때문에 ViewModel의 인스턴스를 만들려면 특수한 메커니즘이 필요합니다. 이 메커니즘이 ViewModelProvider.Factory 인터페이스입니다. 이 인터페이스의 구현만 올바른 범위에서 ViewModel을 인스턴스화할 수 있습니다.
CreationExtras가 포함된 ViewModel
ViewModel 클래스가 생성자에서 종속 항목을 수신하는 경우
팩토리를 제공합니다. 이 팩토리는 ViewModelProvider.Factory 인터페이스를 구현합니다.
ViewModel의 새 인스턴스를 제공하도록 create(Class<T>, CreationExtras) 함수를 재정의합니다.
CreationExtras 를 사용하면 ViewModel을 인스턴스화하는 데 유용한 관련 정보에 액세스할 수 있습니다. Extras에서 액세스할 수 있는 키 목록은 다음과 같습니다.
| 키 | 기능 |
|---|---|
ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY |
ViewModelProvider.get()에 전달한 맞춤 키에 대한 액세스 권한을 제공합니다. |
ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY |
Application 클래스의 인스턴스에 대한 액세스 권한을 제공합니다. |
SavedStateHandleSupport.DEFAULT_ARGS_KEY |
SavedStateHandle을 구성하는 데 사용해야 하는 인수의 Bundle에 대한 액세스 권한을 제공합니다. |
SavedStateHandleSupport.SAVED_STATE_REGISTRY_OWNER_KEY |
ViewModel을 구성하는 데 사용되는 SavedStateRegistryOwner에 대한 액세스 권한을 제공합니다. |
SavedStateHandleSupport.VIEW_MODEL_STORE_OWNER_KEY |
ViewModelStoreOwner을 구성하는 데 사용되는 ViewModel에 대한 액세스 권한을 제공합니다. |
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 멀티플랫폼 모듈 내에서 생성되어 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 및 종속 항목에 관해 자세히 알아보려면 다음 추가 리소스를 참고하세요.
문서
콘텐츠 보기
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- ViewModel의 저장된 상태 모듈
- UI 상태 저장