Skip to content

feat: 修改derivedStateOf 方案 并添加方案4 LaunchedEffect + collect + distinctU…#3

Open
p1ayer1 wants to merge 1 commit into
Tencent-TDS:mainfrom
p1ayer1:feature/0525_derivedStateOf
Open

feat: 修改derivedStateOf 方案 并添加方案4 LaunchedEffect + collect + distinctU…#3
p1ayer1 wants to merge 1 commit into
Tencent-TDS:mainfrom
p1ayer1:feature/0525_derivedStateOf

Conversation

@p1ayer1

@p1ayer1 p1ayer1 commented May 25, 2026

Copy link
Copy Markdown

在运行kuikly-recomposition-analyzer/SKILL后生成的报告中 关于derivedStateOf 派生局部状态相关优化建议生成会有问题

🔴 [高] DiscoverFilterTabBar — 双重重组未完全消除,avg 耗时降低

重组次数:84 次
平均单次耗时:18.61ms(最大 383ms)(v3:37.22ms → 降幅 50%
总耗时:1,563ms(v3:1,861ms → 降幅 16%
双重重组帧:35 帧(归一化后 1.33/100帧,v3 为 3.50/100帧,降幅 62%

问题描述
删除 dismissDrop() 后,dropViewModel.uiState 触发的双重重组减少,但仍有 35 帧出现双重重组。新的触发来源是 filterViewModel.uiState(22 次)和图片加载 State(24 次)。

根因
filterViewModel.uiState 在游戏 tab 切换时更新(getSearchOption 返回),同帧内 dropViewModel.uiState 也在更新(syncMenuData),两个 State 在同帧内各触发一次,导致双重重组。图片加载 State 触发的双重重组是新出现的,需要进一步排查。

优化建议
DiscoverFilterTabBar 内部的 filterViewModel.uiState 订阅改为精准订阅,只读取 confirmedCount

// ❌ 当前:订阅整个 filterUiState
val filterUiState by filterViewModel.uiState.collectAsState()
val badgeCount = filterUiState.confirmedCount

// ✅ 优化:只订阅 confirmedCount
val confirmedCount by remember { derivedStateOf { filterViewModel.uiState.value.confirmedCount } }

其中val confirmedCount by remember { derivedStateOf { filterViewModel.uiState.value.confirmedCount } } 这条是错误建议,原理已在代码改动说说明。
修改skill后优化建议如下

优化建议

filterViewModel.uiState 的订阅从 collectAsState() 改为 LaunchedEffect + map + distinctUntilChanged,只在 confirmedCount 真正变化时才触发 DiscoverFilterTabBar 重组:

// ❌ 当前写法:filterViewModel.uiState 任意字段变化(menuList/pricePresentBean 等)
//    都会触发 DiscoverFilterTabBar 整体重组
val filterUiState by filterViewModel.uiState.collectAsState()
// 使用方式:
badgeCount = filterUiState.confirmedCount

// ✅ 优化:只有 confirmedCount 真正变化时才触发重组
var confirmedCount by remember { mutableStateOf(0) }
LaunchedEffect(filterViewModel) {
    filterViewModel.uiState
        .map { it.confirmedCount }
        .distinctUntilChanged()   // confirmedCount 值未变时不写入,不触发重组
        .collect { confirmedCount = it }
}
// 使用方式(保持不变):
badgeCount = confirmedCount

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant