何时在 Jetpack Compose 中使用 derivedStateOf?

When to use derivedStateOf in Jetpack Compose?

在我的 ViewModel 中我有

private val _topicsResponse = MutableStateFlow<Result<List<Topic>>>(Result.Initial)
val topicsResponse = _topicsResponse.asStateFlow()

我从服务器获取数据(主题),这就是数据包装在 Result<T> class 中的原因。它可以是 Result.InitialResult.LoadingResult.SuccessResult.Error

在主题屏幕的撰写功能中,我有使用 Snackback 显示错误的逻辑

val topicsResponse: Result<List<Topic>> by topicsViewModel.topicsResponse.collectAsState()

Box(modifier = Modifier.fillMaxSize()) {
    ...

    if (topicsResponse is Result.Error) {
        Snackbar(
            action = {
                Button(onClick = { topicsViewModel.loadTopics() }) {
                    Text(stringResource(id = R.string.retry_text))
                }
            },
            modifier = Modifier
                .padding(8.dp)
                .align(Alignment.BottomCenter)
        ) { Text(text = "Test error message") }
    }
}

这里用topicsResponse is Result.Error好吗?

因为我在 https://developer.android.com/codelabs/jetpack-compose-advanced-state-side-effects?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fcompose%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fjetpack-compose-advanced-state-side-effects#8

阅读了有关 derivedStateOf 的内容

所以我不确定是否应该使用

val showSnackBarError by remember {
    derivedStateOf {
        topicsResponse is Result.Error
    }
}

val showSnackBarError = topicsResponse is Result.Error

topicsViewModel.topicsResponse.collectAsState() - collectAsState 已经在其实现中包含 remember

但仍然会在每次重组时计算 topicsResponse is Result.Error,即使此条件的结果与我理解的相同

是的,topicsResponse is Result.Error 将在每次重组时计算,但如果结果没有改变 - 你根本不应该关心它。实际上,这种“计算”对性能没有影响。

你可以在这里使用 remember 并且它会起作用,但是 remember 本身的成本比 is 操作要大得多。所以你会在这方面表现不佳。

至于derivedStateOf - 在这里使用它没有意义。它用于跟踪多个状态变化