Jetpack Compose足球分组赛应用:切换分组后ScoreInput值重置问题求助
解决方案:足球分组赛应用的分数重置与编辑权限问题
一、切换分组时重置分数到初始值0:0
- 给每个分组维护独立的分数数据集合,比如用字典存储,键为分组标识(如GroupA/GroupB),值为该组所有比赛的分数(初始值全为0:0)。
- 维护一个当前选中分组的状态变量,当这个变量变化时,自动从字典中读取对应分组的初始分数,填充到
ScoreInput组件中。 - 示例代码(以Jetpack Compose为例):
// 存储所有分组的分数,初始值都是0:0 val groupScores = remember { mutableStateMapOf( "GroupA" to mutableMapOf("match1" to "0:0", "match2" to "0:0"), "GroupB" to mutableMapOf("match1" to "0:0", "match2" to "0:0"), // 其他4个分组同理 ) } var currentGroup by remember { mutableStateOf("GroupA") } var currentMatchScore by remember { mutableStateOf(groupScores["GroupA"]!!["match1"]!!) } // 切换分组时触发分数重置 LaunchedEffect(currentGroup) { currentMatchScore = groupScores[currentGroup]!!["match1"]!! // 这里可根据当前显示的比赛动态调整 }
二、控制同一组已确认结果的编辑权限
- 新增一个分组确认状态的字典,键为分组标识,值为布尔类型(true表示已确认,false表示未确认)。
- 在
ScoreInput(OutlinedTextField)中设置enabled属性,绑定对应分组的确认状态:已确认则禁用输入,未确认则允许编辑。 - 提供确认/取消确认按钮,点击时更新对应分组的确认状态。
- 示例代码片段:
val groupConfirmed = remember { mutableStateMapOf( "GroupA" to false, "GroupB" to false, // 其他分组默认false ) } // 分数输入组件 OutlinedTextField( value = currentMatchScore, onValueChange = { if (!groupConfirmed[currentGroup]!!) { currentMatchScore = it groupScores[currentGroup]!!["match1"] = it // 更新对应分组的分数存储 } }, enabled = !groupConfirmed[currentGroup]!!, label = { Text("当前比赛分数") } ) // 确认按钮 Button(onClick = { groupConfirmed[currentGroup] = !groupConfirmed[currentGroup]!! }) { Text(if (groupConfirmed[currentGroup]!!) "取消确认" else "确认结果") }
三、复用界面避免重复创建
- 将分组赛事的UI封装成一个可复用组件,接收
currentGroup、groupScores、groupConfirmed以及回调函数作为参数,组件内部根据传入的参数动态渲染对应分组的内容。 - 示例组件结构:
@Composable fun GroupMatchComponent( currentGroup: String, groupScores: MutableStateMap<String, MutableMap<String, String>>, groupConfirmed: MutableStateMap<String, Boolean>, onScoreUpdate: (String, String, String) -> Unit // 分组标识、比赛ID、新分数 ) { // 渲染当前分组的所有比赛输入项 groupScores[currentGroup]?.forEach { (matchId, score) -> OutlinedTextField( value = score, onValueChange = { if (!groupConfirmed[currentGroup]!!) { onScoreUpdate(currentGroup, matchId, it) } }, enabled = !groupConfirmed[currentGroup]!!, label = { Text("比赛$matchId 分数") } ) } }
内容的提问来源于stack exchange,提问作者john2115
相关产品推荐
相关产品推荐

