Как из корутины получить ссылку на instance ViewModel

В приложении, основанном на Compose, есть ViewModel:

class ViewModel(application: Application) : AndroidViewModel(application) {} .

Из него по нажатию кнопки запускается корутина, оторванная от главного потока, в которой выполняется функция function():

viewModelScope.launch(Dispatchers.IO) {
    function()
}

.

Вопрос: есть ли возможность внутри фнкции function(), работающей в отдельной корутине, получить ссылку на уже существующий instance ViewModel (на момент запуска корутины ViewModel уже создан)? Главное то, что корутина, в которой работает function(), не Activity и не Fragment, поэтому в ней не работают варианты типа

by viewModels()

или

by activityViewModels().

Главная цель всего этого - получить возможность запускать другие функции ViewModel из этой корутины, чтобы иметь возможность передавать промежуточные данные из корутины во время ее выполнения в основной поток.

И какие еще есть варианты обмена данными между отделенной от главного потока корутиной и главным потоком?


Ответы (1 шт):

Автор решения: ЮрийСПб

Наверное, вам нужно что-то такое:

  1. Во ViewModel разместите какой-то наблюдаемый из View источник данных. Например так:

     val someState = MutableStateFlow("")
    
  2. Внутри корутины в него что-то передавайте:

     someState.tryEmit("something")
    
  3. Во View как-то реагируйте на изменения в someState (упрощённый пример без Compose, просто в активити/фрагменте)

     lifecycleScope.launch { viewModel.someState.collect { System.out.println(it) } }
    
→ Ссылка