SharedFlow — это холодный Flow, который позволяет нескольким подписчикам получать эмитируемые значения. Каждое значение может быть получено несколькими подписчиками при определенных условиях.
StateFlow — это разновидность SharedFlow, представляющая собой горячий Flow, который всегда имеет последнее эмитированное значение (состояние). При подписке новый подписчик сразу получает текущее состояние.
Основные отличия:
- Холодный/Горячий: SharedFlow по умолчанию холодный (начинает эмиссию при появлении подписчика), но может быть настроен как горячий с помощью параметра
started. StateFlow всегда горячий.
- Начальное значение: SharedFlow по умолчанию не имеет начального значения. StateFlow всегда требует начального значения.
- Повтор значений (replay): SharedFlow может быть сконфигурирован для повторной отправки определенного количества последних значений новым подписчикам с помощью параметра
replay. StateFlow всегда имеет replay = 1.
- Буфер: SharedFlow имеет настраиваемый буфер (
bufferCapacity). StateFlow имеет фиксированный буфер (bufferCapacity = 0).
- Использование: SharedFlow часто используется для событий, которые могут происходить повторно или без сохранения последнего состояния (например, клики по кнопке). StateFlow используется для представления состояния, которое всегда актуально (например, данные экрана).
Пример использования SharedFlow для событий:
kotlin
Пример использования StateFlow для состояния:
kotlin