@Comopsable
fun SomeScreen(
data: MyData,
layoutType: LayoutType
onChangeLayoutField: () -> Unit
){
Row{
when(layoutType){
is AType -> ALayout(data)
is BType -> BLayout(data)
}
Button(
onClick = onChangeLayoutField
)
}
}
@Composable
fun ALayout(
choiceList: List<Choice>,
modifier: Modifier = Modifier
) {
var selectedIndex by rememberSaveable { mutableStateOf(-1) }
LazyColumn(
verticalArrangement = Arrangement.spacedBy(6.dp),
modifier = modifier
) {
items(choiceList.size) { columnIndex ->
val choice = choiceList[columnIndex]
SingleSelectionButton(
index = columnIndex,
text = choice.label ?: "",
isChecked = selectedIndex == columnIndex,
fontSize = 13.sp,
fontColor = Color.Gray002,
onNotifyButtonState = { index, isChecked ->
selectedIndex = index
},
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
)
}
}
}
下面是示例代码。我想在单击按钮后的下一个布局时清除SomeLayout。
我在这里期望的是,当ALayout的数据(来自param)改变时,视图在重组时会清除。但是,它不是。
例如,
- A布局(数据A)-〉A布局(数据B)-〉A布局(数据C):SingleSelectionButton的isChecked状态仍然存在。所以,假设O是isChecked = true,而X是false。在A布局中,我将其设置为X O X X,然后单击Next按钮,然后,X O X X状态仍然存在,甚至上次A布局仍然是X O X X。
1.但是,当存在其他布局时,此处为BLayout,则清除之前的A布局状态,正常工作。例如,A布局(dataA)-〉BLayout(dataB)-〉A布局(dataC)。BLayout清除之前的A布局状态,因此,BLayout之后的新A布局显示X X X,这是正确的。
我也尝试过动画。
val transition = updateTransition(targetState = text, label = text)
val caretIndex by transition.animateInt(
transitionSpec = {
tween(durationMillis = duration.toInt()*text.length)
},
label = "caretIndex"
) { targetText ->
Log.d("aos", "targetText: $targetText")
targetText.length
}
但这也有以前的价值和导致崩溃。
1条答案
按热度按时间noj0wjuj1#
我认为这是因为selectedIndex被记住用于可组合的ALayout,因此只要它仍然在组合中,无论传入ALayout的数据是什么,该值都将被持久化。如果您希望selectedIndex在choiceList更改时被重置,那么您可以将choiceList作为
rememberSaveable
的键传递(参见下面的示例),这将导致selectedIndex值在choiceList更改时被重置。有关记忆如何工作以及键的作用的更多信息,我认为本指南很有帮助。