活动代码将流收集为状态并根据流发出的状态更新 UI。
setContent {
val viewModel: MainViewModel = viewModel()
val state: State<UiState> = viewModel.flow.collectAsStateWithLifecycle(
initialValue = UiState.Loading,
lifecycle,
minActiveState = Lifecycle.State.STARTED
)
MainScreen(uiState = state.value)
}
暴露 StateFlow 的 ViewModel 代码
val flow: Flow<UiState> = repository.flow
.map {
if (it.datetime == "") {
emit(UiState.Error("Failure"))
} else {
UiState.Success(it.datetime)
}
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = UiState.Loading
)
存储库暴露的冷流:
val flow = flow {
while (true) {
delay(5000)
emit(getCurrentTime())
}
}.catch {
// Emit Empty Object which will be treated as an error
emit(CurrentTime(""))
}
如果 Repository 暴露的上游冷流有异常,上游流完成后将不再有排放。 在这种情况下,我们可以向 UI 发出 UiState.Error(如上所示)。
一旦 UI 处于错误状态,我们是否可以重新触发上游流。