Ответ
val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())
Ключевые моменты:
- Обязательно указывайте диспетчер (Dispatchers.Main/IO/Default)
- SupervisorJob() предотвращает отмену всех дочерних корутин при ошибке одной
- Не забывайте отменять scope при уничтожении компонента:
scope.cancel() // в onDestroy() или аналогичном методе
Для ViewModel используйте viewModelScope, для Lifecycle - lifecycleScope, они уже содержат правильную конфигурацию и автоматически отменяются.