技术求助:随机索引始终初始化为0,而非预期随机值
问题原因及解决方案
问题根源
你的代码中rememberSaveable的初始化逻辑只会执行一次(首次组合时),后续即使flashcardUiState发生变化,randomIndex也不会重新生成随机值。如果flashcardUiState初始状态下只有1个元素(索引为0),random()自然返回0;如果元素数量大于1,rememberSaveable会持久化保存首次生成的索引,导致每次重启应用都复用同一个值(比如0)。
解决方案
根据你的需求场景,选择对应方案:
场景1:每次flashcardUiState更新时自动生成新随机索引
使用derivedStateOf让索引依赖flashcardUiState自动更新:
val randomIndex by remember { derivedStateOf { if (flashcardUiState.isNotEmpty()) flashcardUiState.indices.random() else 0 } }
场景2:手动触发生成新随机索引(比如点击按钮)
将索引初始化与更新逻辑分离,通过函数手动触发:
// 用rememberSaveable保存当前索引(可选,若不需要持久化则换成remember) var randomIndex by rememberSaveable { mutableStateOf(0) } // 生成新随机索引的函数 fun refreshRandomIndex() { if (flashcardUiState.isNotEmpty()) { randomIndex = flashcardUiState.indices.random() } }
需要新索引时调用refreshRandomIndex()即可,比如按钮点击事件中:onClick = { refreshRandomIndex() }
场景3:应用启动时自动生成新随机索引(不复用上次保存的值)
改用remember配合LaunchedEffect在启动时生成一次索引:
var randomIndex by remember { mutableStateOf(0) } LaunchedEffect(Unit) { if (flashcardUiState.isNotEmpty()) { randomIndex = flashcardUiState.indices.random() } }
内容的提问来源于stack exchange,提问作者Allen J Mathew
相关产品推荐
相关产品推荐

