You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:随机索引始终初始化为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:20:02