android StateFlow和sharedflow
前言
在 Android/Kotlin 中,StateFlow 和 SharedFlow 都是用于处理数据流的工具,但它们有不同的特性和适用场景。
1.主要区别
StateFlow:
始终有一个当前值(initial value)
只保留最新的值
新订阅者会立即收到当前状态值
自动去重:连续相同的值不会重复发送
是热流(Hot Flow)
SharedFlow
可以没有初始值
可以配置缓存多个历史值
新订阅者默认不会收到之前的值(除非配置了 replay)
不会自动去重
也是热流(Hot Flow)
2.应用场景
2.1StateFlow
2.1.1 适用于:UI 状态管理
class MyViewModel : ViewModel() {private val _uiState = MutableStateFlow(UiState())val uiState: StateFlow<UiState> = _uiState.asStateFlow()// UI 总是需要知道当前状态
}
2.1.2 配置或设置
private val _isDarkMode = MutableStateFlow(false)
val isDarkMode: StateFlow<Boolean> = _isDarkMode
2.1.3 任何需要"当前状态"的场景 - 比如用户登录状态、网络连接状态等
2.2 SharedFlow 适用于:
2.2.1 一次性事件(Events)
class MyViewModel : ViewModel() {private val _events = MutableSharedFlow<Event>()val events: SharedFlow<Event> = _events.asSharedFlow()// 比如显示 Toast、导航事件等fun showToast() {_events.emit(Event.ShowToast("Hello"))}
}
2.2.2 多播场景
// 配置多个订阅者都能收到
private val _clicks = MutableSharedFlow<Unit>(replay = 0,extraBufferCapacity = 1
)
2.2.3 需要保留多个历史值
// 保留最近 5 个值
private val _logs = MutableSharedFlow<String>(replay = 5)
3.快速选择指南
需要"状态"?用 StateFlow
需要"事件"?用 SharedFlow
新订阅者需要立即知道当前值?用 StateFlow
不希望错过任何发射的值?用 SharedFlow (配置适当的 replay 和 buffer)
