插入新数据时如何刷新可组合项?

Dan*_*ian 5 kotlin android-jetpack-compose

我和我的团队必须制作一个车牌扫描应用程序作为学校项目。这样,我们就有了可以添加到货物中的评论和图片。每当用户扫描车牌时,他们还有机会更改检查的信息,以防出现错误。问题是,每当我们从扫描的车牌中删除数据时,它不会在屏幕上显示它已被删除,直到我们转到另一个屏幕。对于我们用来插入新的评论和图片实例的惰性列也是如此。在我们转动屏幕或返回另一个屏幕之前,数据不会显示在屏幕上。private val pictureList = mutableListOf() 是我们用于图片和文本的内容,我们使用 var CountryCode by Remember { mutableStateOf(CountryCodeText) } var licenseNumber by Remember { mutableStateOf(LicenseNumberText) }。pictureList 是全局变量,其他变量是在 mutableStateOf 中使用全局变量的局部变量。如何确保数据变化时 UI 也随之更新?我想提前对您的帮助表示感谢!(代码是用Kotlin和jetpack编写的)

Ric*_*per 5

只需将 替换mutableListOf()为 a mutableStateListOf(...),并且更愿意将所有状态逻辑限制在 ViewModel 中。整个应用程序的视图模型最好只有一个,并且整个应用程序应该只有一个活动。

视图模型应该充当整个活动 UI 状态的单一事实来源,同时还有效处理 UI 的所有更新。

s@Composable应该只负责显示状态,并将事件发送到视图模型以更新状态,例如,onClick可以通过按钮将事件发送到视图模型,从而触发应用程序另一部分的状态更改。

通过Codelab 来了解有关 Compose 中的状态的所有信息(嗯,不是全部,真的,但很好的入门者)。

此外,更改屏幕会破坏@Composables当前屏幕的所有内容,因此当您返回那里时,所有内容@Composables都会重新创建,并获取正确的数据。如果您希望在更改变量时触发“重组”,则必须确保相关变量是状态持有者,即使用预构建的状态初始值设定项之一进行初始化,例如mutableStateOf()、 或mutableStateMapOf等。

我们通常有一种mutableState*Of格式来确定预构建的状态初始值设定项是否可用。显然,最常见的都已涵盖,但如果没有,您将需要自己创建一种新类型的初始化程序,如果您不知道如何执行此操作,目前,您只需检查该类型是否您希望存储的数据是Immutable 的。如果是这样,您可以将其包装在调用中mutableStateOf<DataType>(),它将触发重组。要知道,这不如预先构建的初始化程序那么有效,但绝对可以完成工作。

另外,我建议您采用compose-path来了解基础知识。它涵盖了从使用基本的预构建布局创建简单的 UI 到使用自定义创建复杂的动画驱动应用程序的所有内容Layout

所以,肯定有很多事情要做,但我希望你能做到。

快乐作曲,