by viewModel
- Kotlin course
- Advanced
- Lesson 41/83
- 5 min
Learn ViewModel injection with by viewModel().
What is by viewModel?
by viewModel() is the Koin delegate used to get a ViewModel inside an Activity or Fragment. It works with AndroidX ViewModel.
Example: class MyActivity : AppCompatActivity() { val vm: MyViewModel by viewModel() }. This delegate ties the ViewModel to the Activity lifecycle. When the screen rotates, the ViewModel survives; the new Activity gets the same ViewModel. viewModel is also used in module declarations: viewModel { MyViewModel(get()) }. This lets the ViewModel receive dependencies through Koin.
The viewModel module declaration
To add a ViewModel to a Koin module use viewModel { ... }. This is preferred over single or factory for ViewModels.
Example: module { viewModel { MyViewModel(get()) } }. Here MyViewModel receives other dependencies via get(). The viewModel block ties the ViewModel to the lifecycle. Koin manages the ViewModel lifecycle in line with AndroidX. This prevents memory leaks.
Practice Define a class with by viewModel
Define class MyViewModel. Define class MyActivity with val vm: MyViewModel by viewModel() inside. In main, print println("ViewModel ready").
Starter code
// viewModel delegate
// write here
import org.koin.androidx.viewmodel.ext.android.viewModel
fun main() {
}Sample solution
class MyViewModel
class MyActivity {
val vm: MyViewModel by viewModel()
}
fun main() {
println("ViewModel ready")
}Expected output
ViewModel ready
Questions and answers
Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.
1 Complete the by viewModel call
class MyActivity : AppCompatActivity() {
val vm: MyViewModel ____()
}
class MyActivity : AppCompatActivity() {
val vm: MyViewModel by viewModel()
}
Explanation: by viewModel() fetches the ViewModel.
2 When is by viewModel() preferred?
- To make an HTTP request
- For a database connection
- To serialize JSON
- When getting a ViewModel in an Activity Correct answer
Explanation: by viewModel() is used to get a ViewModel.
3 Match by viewModel parts
| Term | Meaning |
|---|---|
by viewModel |
ViewModel delegate |
MyActivity |
Owning class |
MyViewModel |
ViewModel |
viewModel |
Module declaration |