android 如何给予新的编写函数不同的id(或key?),但相同的函数?

ewm0tg9j  于 2023-03-11  发布在  Android
关注(0)|答案(1)|浏览(99)
@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)改变时,视图在重组时会清除。但是,它不是。
例如,

  1. 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
    }

但这也有以前的价值和导致崩溃。

noj0wjuj

noj0wjuj1#

我认为这是因为selectedIndex被记住用于可组合的ALayout,因此只要它仍然在组合中,无论传入ALayout的数据是什么,该值都将被持久化。如果您希望selectedIndex在choiceList更改时被重置,那么您可以将choiceList作为rememberSaveable的键传递(参见下面的示例),这将导致selectedIndex值在choiceList更改时被重置。

var selectedIndex by rememeberSaveable(choiceList){ mutableStateOf(-1) }

有关记忆如何工作以及键的作用的更多信息,我认为本指南很有帮助。

相关问题