Android ViewModel
This page covers Android-specific ViewModel features. For core ViewModel DSL and multiplatform support, see ViewModel.
Overview
ViewModels are architecture components designed to survive configuration changes and manage UI-related data. Koin provides special support for ViewModels with lifecycle-aware injection.
Key Concepts
- Survives Configuration Changes - ViewModels persist through rotations and theme changes
- Scoped to Lifecycle - Tied to Activity, Fragment, or Navigation Graph lifecycle
- Lazy Creation - Created only when first accessed
- Shared Instances - Can be shared between Fragments and their host Activity
Multiplatform ViewModel - Koin ViewModel DSL is fully multiplatform via koin-core-viewmodel. For Compose Multiplatform, see Compose ViewModel.
ViewModel Scope Limitations
Important: ViewModels are created against the root Koin scope and cannot access Activity or Fragment scoped dependencies. This prevents memory leaks as ViewModels outlive Activities and Fragments.
Need scoped dependencies in ViewModel? Use ViewModel Scope to create a dedicated scope tied to your ViewModel's lifecycle.
Declaring ViewModels
Compiler Plugin DSL
val appModule = module {
viewModel<DetailViewModel>()
viewModel<UserViewModel>()
}
Annotations
@KoinViewModel
class DetailViewModel(
private val repository: DetailRepository
) : ViewModel()
@KoinViewModel
class UserViewModel(
private val userRepository: UserRepository
) : ViewModel()
Classic DSL
val appModule = module {
// With constructor reference
viewModelOf(::DetailViewModel)
// With lambda
viewModel { DetailViewModel(get()) }
}
Injecting ViewModels
In Activity, Fragment or Service, use:
by viewModel()- lazy delegate propertygetViewModel()- eager fetch
class DetailActivity : AppCompatActivity() {
// Lazy inject ViewModel
private val viewModel: DetailViewModel by viewModel()
// Or eager
// private val viewModel: DetailViewModel = getViewModel()
}