The google codelab Android Room with a View - Kotlin has the following snippet:
class WordViewModel(application: Application) : AndroidViewModel(application) {
// ...
private val coroutineContext: CoroutineContext
get() = parentJob + Dispatchers.Main
private val scope = CoroutineScope(coroutineContext)
// ...
}
And from what I understand from this answer, the custom getter is evaluated everytime, whereas the assignment is evaluated at the time of constructing only. So in effect, scope
would take a value that wouldn't change later, so what use is the custom getter for coroutineContext
?
The definition of coroutineContext
as a computed property (or custom getter) makes more sense when you are defining a CoroutineScope
in a component with lifecycle (i.e. Android Activity
). The example in the Javadoc is self-explanatory:
class MyActivity : AppCompatActivity(), CoroutineScope {
lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}
override fun onDestroy() {
super.onDestroy()
job.cancel() // Cancel job on activity destroy. After destroy all children jobs will be cancelled automatically
}
}
In this case, you are creating the Job
in a lifecycle method, that's why you need the computed property to return the coroutineContext
with the Job
instance created in onCreate
.