在LivesCores应用程序中,我如何在不重新打开应用程序的情况下更新比赛结果? 以下是我的ViewModel代码样例,如果有人可以帮忙的话.

@HiltViewModel
class LiveMatchesViewModel @Inject constructor(private val liveMatchesRepository: LiveMatchesRepository): ViewModel() {

    private var _liveMatchesState = MutableStateFlow<MatchState>(MatchState.Empty)
    val liveMatchesState: StateFlow<MatchState> =  _liveMatchesState

    init {
        getAllLiveMatches()
    }

    private fun getAllLiveMatches() {
        _liveMatchesState.value = MatchState.Loading

        viewModelScope.launch(Dispatchers.IO) {

            try {
                val liveMatchesResponse = liveMatchesRepository.getLiveMatches()
                _liveMatchesState.value = MatchState.Success(liveMatchesResponse)
            }
            catch (exception: HttpException) {
                _liveMatchesState.value = MatchState.Error("Something went wrong")
            }
            catch (exception: IOException) {
                _liveMatchesState.value = MatchState.Error("No internet connection")
            }
        }
    }
}

推荐答案

您可以使用LaunchedEffect Composable来实现这一点:

LaunchedEffect(Unit) {
    while (true) {
        liveMatchesViewModel.getAllLiveMatches()
        delay(20000)  // wait for 20 seconds
    }
}

这将每隔20秒重新执行getAllLiveMatches函数.您需要将getAllLiveMatches设置为公共函数才能使其工作.

使用这种方法,当可合成物离开合成时,刷新将被取消.如果这是你想要的,你需要判断自己.

作为替代方案,您可以在viewModelScope中的ViewModel中执行相同的代码.launch函数返回Job,当使用onCleared回调销毁ViewModel时,可以取消该值.

// ...
private var refreshingJob: Job? = null

init {
    getAllLiveMatches()
}

private fun getAllLiveMatches() {

    if (refreshingJob != null) return
    refreshingJob = viewModelScope.launch(Dispatchers.IO) {

        while(true) {

            _liveMatchesState.value = MatchState.Loading
            try {
                val liveMatchesResponse = liveMatchesRepository.getLiveMatches()
                _liveMatchesState.value = MatchState.Success(liveMatchesResponse)
            } catch (exception: HttpException) {
                _liveMatchesState.value = MatchState.Error("Something went wrong")
            } catch (exception: IOException) {
                _liveMatchesState.value = MatchState.Error("No internet connection")
            }

            delay(20000)  // wait for 20 seconds
        }
    }
}

// This will be called when the ViewModel is going to be destroyed
override fun onCleared() {
    super.onCleared()
    refreshingJob?.cancel()
}

只要ViewModel存在,这将刷新数据,这可能与显示数据的Composable可见的时间不同.

Android相关问答推荐

默认调度程序是否在协程中使用共享线程池?

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

LaunchedEffect没有延迟时应用程序崩溃

如何在使用 PointerInput 修改器时添加点击时的波纹效果

Android v31 及更低版本中 ImageView 中的圆角

升级到 Jetpack Compose 物料 list 2023.08.00 需要我将 targetSdk 更改为 34

无法插入 LayoutNode@cc72396 子级,因为它已有父级

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

在 Material 3 TopAppBar 代码的哪个位置定义了填充?

如何在 Delphi 和 Android 上避免 Indy Socket Error #13 Access denied 异常?

如何在 Jetpack Compose 中的特定位置绘制图像

Jetpack compose :使用 rememberSaveable 时未应用待处理的合成

如何在 Jetpack Compose 中设置行宽等于 TextField 的宽度?

如何在 Compose 中使用合并的单元格创建网格视图?

如何在 TextButton 中分隔文本和图标

jetpack compose 中的可点击指示是什么?

如何在 Jetpack Compose 中禁用 TabRow 或 Tab 中的涟漪效应?

如何在android studio 2021.1中使用谷歌库以外的库

在视图判断器中更新边距值对布局没有影响

compose UI 测试 - 如何断言文本 colored颜色 ?