何时在 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.Initial
、Result.Loading
、Result.Success
和 Result.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
好吗?
阅读了有关 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
- 在这里使用它没有意义。它用于跟踪多个状态变化
在我的 ViewModel 中我有
private val _topicsResponse = MutableStateFlow<Result<List<Topic>>>(Result.Initial)
val topicsResponse = _topicsResponse.asStateFlow()
我从服务器获取数据(主题),这就是数据包装在 Result<T>
class 中的原因。它可以是 Result.Initial
、Result.Loading
、Result.Success
和 Result.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
好吗?
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
- 在这里使用它没有意义。它用于跟踪多个状态变化