我正在学习Kotlin ,这是我的第一个Kotlin .所以请耐心听我说.

所以,我有这个数据类:

data class Order(
    var title: String,
    var qty: Int,
    var price: Int
) {
    val total: Int
        get() {
            return qty * price
        }
}

我创建了这项服务来处理订单:

class OrderService {
    val orders: MutableList<Order> = mutableListOf()

    fun addOrder(order: Order) {
        orders.add(order)
        println(order);
        println(orders.count())
    }
}

然后我将该示例修改为如下所示:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Learn1Theme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    val orderService = OrderService()
                    var counters = remember {
                        MutableStateFlow(orderService)
                    }
                    OrderCards(itemList = orderService.orders)
                    AddButton {
                        counters.apply {
                            orderService.addOrder(Order("newItem", 100, 20))
                        }
                    }
                }
            }
        }
    }
}

@Composable
fun OrderCards(itemList: List<Order>) {
    LazyColumn {
        items(items = itemList) {
            ItemCard(item = it)
        }
    }
}

@Composable
fun ItemCard(item: Order) {
    Card(
        modifier = Modifier
            .padding(8.dp)
            .fillMaxWidth(),
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
    ) {
        Column {
            Text(text = "Date: ${item.title}")
        }
    }
}

@Composable
fun AddButton(action: () -> Unit) {
    Box {
        FloatingActionButton(
            onClick = action,
            modifier = Modifier
                .padding(16.dp)
                .align(alignment = Alignment.BottomEnd)
        ) {
            Icon(imageVector = Icons.Default.Add, contentDescription = "Add")
        }
    }
}

我看到了一些如何使用Flow的示例,但我不确定如何实现它,我确信我在那里做错了什么,因为我按下按钮后屏幕显然没有更新.

addButton工作,因为我可以看到,订单列表添加.它只是没有更新屏幕

有谁能帮我更新一下屏幕吗?

谢谢

推荐答案

这一点:

val orders: MutableList<Order> = mutableListOf()

需要得到mutableStateListOf分,如:

val orders = mutableStateListOf<Order>()

没有State,简单的MutableList list 是无法观察到的.

在可组合函数执行期间读取Value属性的可变值持有者,当前的RecomposeScope将订阅该值的更改.当Value属性被写入和更改时,将计划重新组合任何订阅的RecomposeScope.如果使用相同的值写入值,则不会安排重新组合.

还有这一点:

val orderService = OrderService()

应该是:

 val orderService = remember { OrderService() }

否则,每次重新组合时,OrderService都会被重置.

有关其工作原理的详细说明,请参阅State in composables.

可组合函数可以使用Memory API在内存中存储对象.在初始合成期间,由Memory计算的值存储在合成中,并且在重新合成期间返回存储的值.记住可以用来存储可变对象和不可变对象.

Android相关问答推荐

Android深度链接配置中的URL片段匹配'

懒惰列的滚动到项目不按预期工作'

如何使用Gradle风味在两个Kotlin导入(Google vs Amazon Java billing library)之间进行 Select ?

图像在Android Studio中显示,但不在设备中显示

即使安装了Chrome和YouTube,Android对action_view a YouTube URL的意图也是空的

Android:微调:在代码中设置ArrayAdapter不希望调用On ItemSelected,仅当用户单击微调时调用

ERR_SSL_VERSION_OR_CIPHER_MISMATCH - Android Webview

Jetpack Compose中尺寸不断增加的动画

Jetpack Compose-如何在进入新产品线之前删除单词?

在c中更新MVVMCross中TextView的Alpha#

如何显示具体的商品数量?

Android WebView 不会在滚动端加载新内容

Android Studio:按下前缀键:切换 Logcat 格式

当包含可绘制对象的整数变量传递给 painterResource 函数时,为什么图像不在 Android Studio 中呈现?

如何放置在柱子的角落(底端)

Jetpack compose 未解决的参考错误

Hilt 依赖注入重复绑定错误

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?

如何在不使用 NestedScrollView 的情况下使用带有 CollapsingToolbar 的 ViewPager?

如何在 Android Studio 中使用 SDK 30 和 Android 10?