為什么Android Jetpack Compose snapShotFlow在配置更改時重新發出上一個值

我當前的Android Jetpack Compose應用程序使用snapShotFlowmutableStateOf()轉換為流并觸發用戶操作,如下所示

In ViewModel:-

var displayItemState by mutableStateOf(DisplayItemState())


@Immutable
data class DisplayItemState(
    val viewIntent: Intent? = null
)

In composable:-

val displayItemState = viewModel.displayItemState

LaunchedEffect(key1 = displayItemState) {
    snapshotFlow { displayItemState }
        .distinctUntilChanged()
        .filter { it.viewIntent != null }
        .collectLatest { displayItemState ->
            context.startActivity(displayItemState.viewIntent)
        }
}

當我將測試設備保持在縱向或橫向時,一切都按預期工作。

但是,當我更改設備方向時,將重新發送上次收集的snapShotFlow值。

如果我在snapShotFlow中按如下方式重置displayItemState,這將修復問題,但這感覺是錯誤的修復。我做錯了什么?阻止snapShotFlow在方向更改時重新觸發的正確方法是什么

val displayItemState = viewModel.displayItemState

LaunchedEffect(key1 = displayItemState) {
    snapshotFlow { displayItemState }
        .distinctUntilChanged()
        .filter { it.viewIntent != null }
        .collectLatest { displayItemState ->
            context.startActivity(displayItemState.viewIntent)
            viewModel.displayItemState = DisplayItemState()
        }
}
? 最佳回答:

這是有意的行為,你沒有做錯任何事。Compose的(Mutable)State保存最后一個值,類似于StateFlow,因此它們的新集合總是以最后一個數值開始。

您的解決方案是好的,Android的應用程序架構指南中實際上推薦了非常類似的內容:

例如,當在屏幕上顯示瞬時消息以讓用戶知道發生了什么事情時,UI需要通知ViewModel在消息顯示在屏幕上時觸發另一個狀態更新。

另一種可能是在viewModel中使用SharedFlow而不是MutableState-SharedFlow不保留最后一個值,因此不會出現此問題。

主站蜘蛛池模板: 国产一区二区三区不卡观| 成人区精品一区二区不卡亚洲| 男人免费视频一区二区在线观看| 无码国产精品久久一区免费| 日韩精品一区二区三区在线观看l 日韩精品一区二区三区毛片 | 岛国精品一区免费视频在线观看| 国产伦精品一区二区三区视频猫咪| 麻豆一区二区三区蜜桃免费| 日韩精品成人一区二区三区| 中日韩精品无码一区二区三区| 国产精品乱码一区二区三区| 亚洲AV无码一区二区二三区软件| 成人免费视频一区| 中文字幕一区二区三区在线不卡| 日韩一区二区三区射精| 狠狠色成人一区二区三区| 亚洲av无码一区二区三区四区| 亚州日本乱码一区二区三区| 国产亚洲福利精品一区| 中文字幕一区二区人妻性色| 中文字幕一区二区三区日韩精品 | 性无码一区二区三区在线观看| 东京热无码av一区二区| 亚洲AV综合色区无码一区| 国99精品无码一区二区三区 | 久久精品国产亚洲一区二区| 香蕉久久ac一区二区三区| 无码精品人妻一区二区三区免费看| 亚洲精品日韩一区二区小说| 日韩AV无码一区二区三区不卡毛片 | 韩国精品福利一区二区三区| 国产午夜精品免费一区二区三区| 国产一区二区三区小向美奈子 | 成人区精品人妻一区二区不卡| 国产综合无码一区二区色蜜蜜| 亚洲一区二区三区电影| 亚洲AV综合色一区二区三区| 一本AV高清一区二区三区| 精品视频一区二区| 国产激情一区二区三区在线观看| 中文字幕aⅴ人妻一区二区|