我正在学习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中点击滑动时触发的手势

以编程方式更改Android应用程序上的文件许可

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

Android系统应用程序启用编程以太网网络共享

react 本机生成失败,出现异常.错误:无法确定';<;宏/>;的类型

Android从已连接的设备获得GATT

为什么Kotlin允许将非空值类型化为可空类型,但又将其视为非空值?

我无法连接到信号机

学习Kotlin问题.无法理解Modifier参数

Jetpack Compose 如何使一个项目相对于另一个项目垂直居中

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

在 Compose 中停止键盘将顶部应用栏推离屏幕

每次在 Jetpack Compose 中调用导航

在 Kotlin 中循环遍历字符串并用新行替换句号

Jetpack compose 未解决的参考错误

无法为:app@debug/compileClasspath解析依赖项com.github.dhaval2404:imagepicker-support:1.7.1

如何处理 com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "T1V 4Y8" Kotlin

在 Kotlin 客户端应用程序中发送 FCM 推送通知 - Firebase 云消息传递

如何在 Kotlin 中使用反向绑定适配器将小写文本转换为大写?

如何将 Android Studio 与模拟器连接起来