Inject ViewModels
Koject allows you to easily inject ViewModels into your Android application.
Setup for ViewModels
Add the appropriate dependencies for the injection target:
dependencies {
// Inject ViewModel into Activity
implementation("com.moriatsushi.koject:koject-android-activity:1.3.0")
// Inject ViewModel into Fragment
implementation("com.moriatsushi.koject:koject-android-fragment:1.3.0")
// ViewModelFactory only
implementation("com.moriatsushi.koject:koject-android-viewmodel:1.3.0")
}
Please also refer to the Setup document.
Using ViewModels
To define a ViewModel
, specify the @ViewModelComponent
and @Provides
annotations.
You can use constructor injection as with other types:
@Provides
@ViewModelComponent
class TopViewModel(
private val userRepository: UserRepository,
private val contentRepository: ContentRepository,
): ViewModel() {
/* ... */
}
When using ViewModels, use the ComponentActivity.lazyViewModels()
function:
class TopActivity : ComponentActivity() {
private val viewModel: TopViewModel by lazyViewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
/* ... */
}
}
For fragments, use the Fragment.lazyViewModels()
function:
class TopFragment : Fragment() {
private val viewModel: TopViewModel by lazyViewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
/* ... */
}
}
Refer to the documentation to inject ViewModels in Jetpack Compose.
As of version v1.3.0, injectViewModels()
has been renamed to lazyViewModels()
:
// Until v1.1.0
private val viewModel: TopViewModel by injectViewModels()
// Since v1.3.0
private val viewModel: TopViewModel by lazyViewModels()
Working with SavedStateHandle
SavedStateHandle is used to save ViewModel state.
Koject allows you to inject SavedStateHandle
out of the box.
@Provides
@ViewModelComponent
class SavedStateViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
/* ... */
}
class TopActivity : ComponentActivity() {
private val viewModel: SavedStateViewModel by lazyViewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
/* ... */
}
}
Inject ViewModel's CoroutineScope
Types with ViewModelComponent
annotations can only be injected into ViewModel
and can inject ViewModel's CoroutineScope
.
The @ViewModelCoroutineScope
qualifier is required to use the CoroutineScope
.
@Provides
@ViewModelComponent
class ViewModelHelper(
@ViewModelCoroutineScope
val scope: CoroutineScope // same as ViewModel.viewModelScope
) {
/* ... */
}
@Provides
@ViewModelComponent
class SomeViewModel(
val helper: ViewModelHelper
): ViewModel() {
/* ... */
}
Check the Android components documentation for all available components for Android.