Как из корутины получить ссылку на 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 шт):
Наверное, вам нужно что-то такое:
Во ViewModel разместите какой-то наблюдаемый из View источник данных. Например так:
val someState = MutableStateFlow("")Внутри корутины в него что-то передавайте:
someState.tryEmit("something")Во View как-то реагируйте на изменения в someState (упрощённый пример без Compose, просто в активити/фрагменте)
lifecycleScope.launch { viewModel.someState.collect { System.out.println(it) } }