我对 Jetpack compose 显示包含一系列ModelList
项目的模型时遇到问题。添加新项目时,UI 元素的顺序会变得不正确。
这是一个非常简单CounterModel
的包含 a ModelList
of ItemModel
s:
@Model
data class CounterModel(
var counter: Int = 0,
var name: String = "",
val items: ModelList<ItemModel> = ModelList()
)
@Model
data class ItemModel(
var name: String
)
屏幕显示两个卡片行,每个ItemModel
:RowA
和RowB
。当我创建使用以下内容初始化的此屏幕时CounterModel
:
val model = CounterModel()
model.name="hi"
model.items.add(ItemModel("Item 1"))
model.items.add(ItemModel("Item 2"))
CounterModelScreen(model)
...它按预期显示如下:
项目 1 A 行
项目 1 B 行
项目 2 A 行
项目 2 B 行
当我单击“添加”按钮以插入新的ItemModel
时,我只是希望看到
项目 3 A 行
项目 3 B 行
在底部。但是相反,顺序是混乱的,我看到两个 rowAs 然后是两个 rowB:
项目 1 A 行
项目 1 B 行
项目 2 A 行
项目 3 A 行
项目 3 B 行
项目 2 B 行
我真的不明白这怎么可能。UI 代码非常简单:循环遍历items
并发出RowA
和RowB
为每个:
for (i in counterModel.items.indices) {
RowA(counterModel, i)
RowB(counterModel, i)
}
使用 Android Studio 4.0C6
这是完整的代码:
@Composable
fun CounterModelScreen(counterModel: CounterModel) {
Column {
TopAppBar(title = {
Text(
text = "Counter Model"
)
})
CounterHeader(counterModel)
for (i in counterModel.items.indices) {
RowA(counterModel, i)
RowB(counterModel, i)
}
Button(
text = "Add",
onClick = {
counterModel.items.add(ItemModel("Item " + (counterModel.items.size + 1)))
})
}
}
@Composable
fun CounterHeader(counterModel: CounterModel) {
Text(text = counterModel.name)
}
@Composable
fun RowA(counterModel: CounterModel, index: Int) {
Padding(padding = 8.dp) {
Card(color = Color.White, shape = RoundedCornerShape(4.dp)) {
Column(crossAxisSize = LayoutSize.Expand) {
Text(
text = counterModel.items[index].name
)
Text(text = "Row A")
}
}
}
}
@Composable
fun RowB(counterModel: CounterModel, index: Int) {
Padding(padding = 8.dp) {
Card(color = Color.Gray, shape = RoundedCornerShape(4.dp)) {
Column(crossAxisSize = LayoutSize.Expand) {
Text(
text = counterModel.items[index].name
)
Text(text = "Row B")
}
}
}
}