El Android Room with a View - Kotlin de Google Codelab tiene el siguiente fragmento :
class WordViewModel(application: Application) : AndroidViewModel(application) { // ... private val coroutineContext: CoroutineContext get() = parentJob + Dispatchers.Main private val scope = CoroutineScope(coroutineContext) // ... }
Y por lo que entiendo de esta respuesta, el captador personalizado se evalúa cada vez, mientras que la asignación se evalúa solo en el momento de la construcción. Entonces, en efecto, el scope
tomaría un valor que no cambiaría más tarde, entonces, ¿de qué sirve el captador personalizado para coroutineContext
?
Creo que en este ejemplo podemos deshacernos de
private val coroutineContext: CoroutineContext get() = parentJob + Dispatchers.Main
y solo escribe
private val scope = CoroutineScope(parentJob + Dispatchers.Main)
Así que el código de resultado se verá así:
class WordViewModel(application: Application) : AndroidViewModel(application) { private var parentJob = Job() private val scope = CoroutineScope(parentJob + Dispatchers.Main) // ... }
Supongo que es una cuestión de estilo escribir getter en este caso. Nada cambiará si lo eliminamos.
La definición de coroutineContext
como una propiedad calculada (o captador personalizado) tiene más sentido cuando define un CoroutineScope
en un componente con ciclo de vida (es decir, Activity
de Android). El ejemplo en el Javadoc se explica por sí mismo:
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 } }
En este caso, está creando el Job
en un método de ciclo de vida, por eso necesita la propiedad computada para devolver el coroutineContext
con la instancia de Job
creada en onCreate
.