簡體   English   中英

何時在 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

在我的主題屏幕撰寫 function 中,我有使用 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 ://developer.android.com/codelabs/jetpack-compose-advanced-state-side-effects?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fcompose 閱讀了 derivedStateOf %23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fjetpack-compose-advanced-state-side-effects#8

所以我不確定我是否應該使用

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 - 在這里使用它沒有意義。 它用於跟蹤多個 state 變化

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM