Оператор stateIn не обновляет кэшированное значение потока состояний

#android #kotlin #kotlin-flow #kotlin-coroutines

Вопрос:

У меня есть несколько общих потоков, которые объединяются в несколько потоков в разных классах, а затем эти потоки объединяются в один. Исходные общие потоки настроены таким образом:

 protected val statusMutable = MutableSharedFlow<Int>()
val status: Flow<Int> = statusMutable.asSharedFlow()
 

Итак, конфигурация по умолчанию. В конце концов, у меня есть такой код:

 val status
    get() = merge(
        object1.status, // merged shared flows
        object2.status, // merged shared flows
        object3.status, // merged shared flows
        statusMutable
    ).stateIn(GlobalScope, SharingStarted.Lazily, initialValue = someInt)
 

Этот поток должен быть бесконечным горячим потоком, поэтому я использую GlobalScope (вы также можете сказать мне, как лучше подойти к этому, если есть лучший способ, но это не настоящая проблема).

Фактическая проблема заключается в том, что значения выдаются и собираются нормально, но результат StateFlow по какой-то причине не обновляет свое свойство value (следовательно, кэш воспроизведения). Это приводит к ситуации, когда новый подписчик не получает последнее значение по подписке. Что может быть причиной этого и как я могу это исправить?

Ответ №1:

Оказывается, проблема в том, что я получаю доступ к этому потоку через геттер, хотя мне просто нужно было назначить его свойству. Какая глупая ошибка! Что забавно, я сам отказался от поиска ответа и опубликовал этот вопрос только для того, чтобы заметить ошибку примерно через 15 минут.