iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android Compose Column列表不自动刷新问题如何解决
  • 693
分享到

Android Compose Column列表不自动刷新问题如何解决

2023-07-05 02:07:01 693人浏览 薄情痞子
摘要

本篇内容介绍了“Android Compose Column列表不自动刷新问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能

本篇内容介绍了“Android Compose Column列表不自动刷新问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    1. 背景

    我们都知道,Compose可以使用mutableStateOf和UI进行绑定,改变值之后,就可以改变UI。

    var value by remember { mutableStateOf(0) }var imageVisible by remember { mutableStateOf(true) }Column {    Text(text = "现在的值是:$value")    Button(onClick = {        value++ //修改值,自动改变UI    }) {        Text(text = "Add Value")    }    AnimatedVisibility(visible = imageVisible) {        Image(            painter = painterResource(id = R.mipmap.photot1),            contentDescription = "",            Modifier.width(260.dp)        )    }    Button(onClick = {        imageVisible = !imageVisible //修改值,自动显示/隐藏UI    }) {        Text(text = "Show/Hide")    }}

    效果如下

    Android Compose Column列表不自动刷新问题如何解决

    但是如果是使用Column/Row/LazyColumn/LazyRow列表的时候,无论怎么更新数据,界面都不会刷新

    val list = ArrayList<String>()for (i in 0..10) {    list.add(i.toString())}var stateList by remember { mutableStateOf(list) }Button(onClick = {    stateList.add("添加的值:${Random.nextInt()}")}, modifier = Modifier.fillMaxWidth()) {    Text(text = "添加值")}Button(onClick = {    stateList.removeAt(stateList.size - 1)}, modifier = Modifier.fillMaxWidth()) {    Text(text = "删除值")}LazyColumn {    items(stateList.size) { index ->        Text(            text = "${stateList.get(index)}",            textAlign = TextAlign.Center,            modifier = Modifier                .height(24.dp)                .fillMaxWidth()        )    }}

    可以看到,点击了按钮后,列表完全没有刷新

    Android Compose Column列表不自动刷新问题如何解决

    这是为什么了 ?

    2. 解决方案

    当时很不解,为啥其他类型都是可以的,使用List就不行了呢 ?

    查阅了好久,终于找到了解决方案

    mutableStateOf改用mutableStateListOf就可以了

    var stateList = remember { mutableStateListOf<String>() }for (i in 0..10) {    stateList.add(i.toString())}Button(onClick = {    stateList.add("添加的值:${Random.nextInt()}")}, modifier = Modifier.fillMaxWidth()) {    Text(text = "添加值")}Button(onClick = {    stateList.removeAt(stateList.size - 1)}, modifier = Modifier.fillMaxWidth()) {    Text(text = "删除值")}LazyColumn {    items(stateList.size) { index ->        Text(            text = "${stateList.get(index)}",            textAlign = TextAlign.Center,            modifier = Modifier                .height(24.dp)                .fillMaxWidth()        )    }}

    Android Compose Column列表不自动刷新问题如何解决

    3. 原因

    解决方案很简单,但是这是为什么呢 ?

    1 mutableStateOf为什么可以更新UI

    我们以mutableStateOf()这个为例

    var value by mutableStateOf(0)

    首先,我们要明白,mutableStateOf()返回的是一个MutableState对象,MutableState中有一个var value: T属性

    interface MutableState<T> : State<T> {    override var value: T    operator fun component1(): T    operator fun component2(): (T) -> Unit}interface State<out T> {    val value: T}

    查看mutableStateOf源码,可以发现,mutableStateOf()返回的是继承自MutableStateSnapshotMutableState对象,路径mutableStateOf()-> createSnapshotMutableState() -> ParcelableSnapshotMutableState-> SnapshotMutableStateImpl,可以看到有这样一段代码

    override var value: T    get() = next.readable(this).value    set(value) = next.withCurrent {        if (!policy.equivalent(it.value, value)) {            next.overwritable(this, it) { this.value = value }        }    }private var next: StateStateRecord<T> = StateStateRecord(value)

    这里就是重点,SnapshotMutableStateImplvalue属性重写了get()set()方法

    • value被读的时候,不光把值返回,还会记录一下在哪被读的

    • value被写的时候,不止把这个值给改了,还会去查找在哪里被读过,然后通知这些被读过的地方,通知UI进行刷新

    4. 结论

    因为我们操作StringInt等基础类型的时候,都是通过getset()来获取、设置数据的,所以这操作会被SnapshotMutableStateImpl记录下来,而ListMap这种集合,我们是通过addremove来更新数据的,所以不会触发SnapshotMutableStateImpl value属性的set

    4.1 解决方案一

    使用mutableStateListOf替代mutableStateOfmutableStateListOf内部对addremove方法也进行了重写

    4.2 解决方案二

    新创建一个List,然后赋值给原来的list,这样就会触发set

    var stateList by remember { mutableStateOf(list) }val tempList = ArrayList<String>()for (value in stateList) {    tempList.add(value)}tempList.add("添加的值:${Random.nextInt()}")stateList = tempList //赋值的时候会触发刷新UI

    5.自己实现一个mutableStateOf()

    我们也可以自己来实现一个mutableStateOf,伪代码如下

    class Test {    interface State<out T> {        val value: T    }    interface MutableState<T> : State<T> {        override var value: T            }    inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value    inline operator fun <T> MutableState<T>.setValue(        thisObj: Any?,        property: KProperty<*>,        value: T    ) {        this.value = value    }    interface SnapshotMutableState<T> : MutableState<T> {        val policy: SnapshotMutationPolicy<T>    }    interface SnapshotMutationPolicy<T> {        fun equivalent(a: T, b: T): Boolean        fun merge(previous: T, current: T, applied: T): T? = null    }    internal open class SnapshotMutableStateImpl<T>(        val _value: T,        override val policy: SnapshotMutationPolicy<T>    ) : SnapshotMutableState<T> {        private var next : T = 52 as T        @Suppress("UNCHECKED_CAST")        override var value: T            get() = next                        set(value) {                Log.i(TAGs.TAG, "setValue")                this.value = value            }            }    internal class ParcelableSnapshotMutableState<T>(        value: T,        policy: SnapshotMutationPolicy<T>    ) : SnapshotMutableStateImpl<T>(value, policy) {    }    fun <T> mutableStateOf(        value: T,        policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy()    ): MutableState<T> = createSnapshotMutableState(value, policy)    fun <T> structuralEqualityPolicy(): SnapshotMutationPolicy<T> =        StructuralEqualityPolicy as SnapshotMutationPolicy<T>    private object StructuralEqualityPolicy : SnapshotMutationPolicy<Any?> {        override fun equivalent(a: Any?, b: Any?) = a == b        override fun toString() = "StructuralEqualityPolicy"    }    fun <T> createSnapshotMutableState(        value: T,        policy: SnapshotMutationPolicy<T>    ): SnapshotMutableState<T> = ParcelableSnapshotMutableState(value, policy)    fun main() {        var sizeUpdate by mutableStateOf(48)        Log.i(TAGs.TAG, "sizeUpdate:$sizeUpdate")        sizeUpdate = 64        Log.i(TAGs.TAG, "sizeUpdate>>$sizeUpdate")    }}

    “Android Compose Column列表不自动刷新问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Android Compose Column列表不自动刷新问题如何解决

    本文链接: https://www.lsjlt.com/news/348933.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Android Compose Column列表不自动刷新问题如何解决
      本篇内容介绍了“Android Compose Column列表不自动刷新问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
      99+
      2023-07-05
    • AndroidComposeColumn列表不自动刷新问题
      目录1. 背景2. 解决方案3. 原因4. 结论4.1 解决方案一4.2 解决方案二5.自己实现一个mutableStateOf()1. 背景 我们都知道,Compose可以使用mu...
      99+
      2023-01-30
      Android Compose Column Android Compose Column列表刷新
    • Java中logback 自动刷新不生效的问题解决
      目录一、背景二、问题排查三、问题处理一、背景 今天心血来潮,准备测试一下项目中 logback 的自动刷新功能,但是测试时发现并不生效。logback 的配置如下: <conf...
      99+
      2023-05-19
      Java logback 自动刷新不生效 Java logback 自动刷新
    • react不自动刷新如何解决
      这篇文章主要介绍了react不自动刷新如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react不自动刷新如何解决文章都会有所收获,下面我们一起来看看吧。react不自动刷新的解决办法:1、找到“pack...
      99+
      2023-07-04
    • vue-router中重定向不刷新问题如何解决
      这期内容当中小编将会给大家带来有关vue-router中重定向不刷新问题如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前阵子太忙了,自己一个人一边开发着新项目,一...
      99+
      2022-10-19
    • 如何解决Vue相同路由参数不同不会刷新的问题
      小编给大家分享一下如何解决Vue相同路由参数不同不会刷新的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通常情况下我们喜欢设...
      99+
      2022-10-19
    • 如何解决Vue相同路由不同参数的刷新问题
      这篇文章给大家分享的是有关如何解决Vue相同路由不同参数的刷新问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在使用vue和vue-router开发spa应用时,我们会遇到这样...
      99+
      2022-10-19
    • 如何解决Vue路由this.route.push跳转页面不刷新的问题
      这篇文章主要讲解了“如何解决Vue路由this.route.push跳转页面不刷新的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决Vue路由this.route.push跳转页面...
      99+
      2023-06-20
    • 如何解决Ajax提交Form表单页面仍会刷新的问题
      小编给大家分享一下如何解决Ajax提交Form表单页面仍会刷新的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!搞了半天原来点...
      99+
      2022-10-19
    • 如何解决vue路由变化页面数据不刷新的问题
      这篇文章给大家分享的是有关如何解决vue路由变化页面数据不刷新的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。每天记录一点点,把我遇到的问题记录下来, 希望可以帮助到更多和我...
      99+
      2022-10-19
    • FineReport中如何用JavaScript解决控件值刷新不及时的问题
      这篇文章主要介绍“FineReport中如何用JavaScript解决控件值刷新不及时的问题”,在日常操作中,相信很多人在FineReport中如何用JavaScript解决控件值刷新不及时的问题问题上存在疑惑,小编查阅了各式资料,整理出简...
      99+
      2023-06-04
    • 如何通过history解决ajax不支持前进/后退/刷新的问题
      这篇文章主要介绍如何通过history解决ajax不支持前进/后退/刷新的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言:现在前后端基本都是通过ajax实现前后端接口数据的交...
      99+
      2022-10-19
    • 如何解决jquery中ajax多次请求数据时不刷新的问题
      这篇文章主要为大家展示了“如何解决jquery中ajax多次请求数据时不刷新的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决jquery中ajax多...
      99+
      2022-10-19
    • 如何解决刷新页面vuex数据不消失和不跳转页面的问题
      小编给大家分享一下如何解决刷新页面vuex数据不消失和不跳转页面的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先说点什么v...
      99+
      2022-10-19
    • 如何解决Dreamweaver代码不自动提示的问题
      这篇文章给大家分享的是有关如何解决Dreamweaver代码不自动提示的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Dreamweaver代码不自动提示的问题,不论是HTML还是CSS,在网上搜索了半天,大...
      99+
      2023-06-08
    • 如何解决Vue中数组和对象更改后视图不刷新的问题
      这篇文章主要为大家展示了“如何解决Vue中数组和对象更改后视图不刷新的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Vue中数组和对象更改后视图不刷...
      99+
      2022-10-19
    • 如何解决win10系统更新时卡住不动的问题
      这篇文章主要介绍如何解决win10系统更新时卡住不动的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先使用win+r快捷键,直接打开运行窗口,并输入services.msc命令,回车。然后可以在“服务”页面中,...
      99+
      2023-06-27
    • elementUI的table表格改变数据不更新问题如何解决
      这篇文章主要介绍“elementUI的table表格改变数据不更新问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“elementUI的table表格改变数据不更新问题如何解决”文章能帮助大...
      99+
      2023-06-29
    • Python输出列表不带中括号和引号的问题如何解决
      这篇文章主要介绍了Python输出列表不带中括号和引号的问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python输出列表不带中括号和引号的问题如何解决文章都会有所收获,下面我们一起来看看吧。正常p...
      99+
      2023-07-05
    • spss如何解决列表中不允许存在字符串变量的问题
      这篇文章主要介绍了spss如何解决列表中不允许存在字符串变量的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。解决方法:首先打开需要进行操作的spss;然后点击页面底部的“...
      99+
      2023-06-15
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作