从 Jetpack compose 中的 Activity 的 StateFlow/SharedFlow 重新触发集合

问题描述 投票:0回答:0

活动代码将流收集为状态并根据流发出的状态更新 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 处于错误状态,我们是否可以重新触发上游流。

android-jetpack-compose kotlin-flow kotlin-stateflow kotlin-sharedflow
© www.soinside.com 2019 - 2024. All rights reserved.