Jetpact Compose状态管理简单理解,如何保证高可用

而 HelloContent 中发生的更改它也不能自己进行处理,必须将更改传给HelloScreen进行处理并重组界面。

以上的逻辑叫做:状态下降,事件上升


@Composable

fun HelloScreen() {

    var name by rememberSaveable { mutableStateOf("") }



    HelloContent(name = name, onNameChange = { name = it })

}



@Composable

fun HelloContent(name: String, onNameChange: (String) -> Unit) {

    Column(modifier = Modifier.padding(16.dp)) {

        Text(

            text = "Hello, $name",

            modifier = Modifier.padding(bottom = 8.dp),

            style = MaterialTheme.typography.h5

        )

        OutlinedTextField(

            value = name,

            onValueChange = onNameChange,

            label = { Text("Name") }

        )

    }

}



[](

)存储状态的方式


前面的介绍中我们知道使用rememberSaveable方法我们可以通过 Bundle 的方式保存状态,那么如果我们要保存的状态不方便用 Bundle 的情况下该何如处理呢?

以下三种方式,可以实现对非 Bundle 的数据的保存(配置更改后的保存)

[](

)Parcelize

代码示例:


@Parcelize

data class City(val name: String, val country: String) : Parcelable



@Composable

fun CityScreen() {

    var selectedCity = rememberSaveable {

        mutableStateOf(City("Madrid", "Spain"))

    }

}



[](

)MapSaver


data class City(val name: String, val country: String)



val CitySaver = run {

    val nameKey = "Name"

    val countryKey = "Country"

    mapSaver(

        save = { mapOf(nameKey to it.name, countryKey to it.country) },

        restore = { City(it[nameKey] as String, it[countryKey] as String) }

    )

}



@Composable

fun CityScreen() {

    var selectedCity = rememberSaveable(stateSaver = CitySaver) {

        mutableStateOf(City("Madrid", "Spain"))

    }

}



[](

)ListSaver


data class City(val name: String, val country: String)



val CitySaver = listSaver<City, Any>(

    save = { listOf(it.name, it.country) },//数组中保存的值和City中的属性是顺序对应的

    restore = { City(it[0] as String, it[1] as String) }

)



@Composable

fun CityScreen() {

    var selectedCity = rememberSaveable(stateSaver = CitySaver) {

        mutableStateOf(City("Madrid", "Spain"))

    }

}



[](

)状态管理源码分析


[](

)remember

初次阅读 remember 的源码,可能有理解不对的地方(但总得有人先去看不是),多多见谅,欢迎指正

  • remember 方法调用的主流程

remember方法返回的是一个MutableState对象,MutableState可以在数据更新的时候通知系统重组ui

Jetpact Compose状态管理简单理解,如何保证高可用

rememberedValue 就是数据转换的逻辑

  • rememberedValue 方法解析

Jetpact Compose状态管理简单理解,如何保证高可用

inserting:如果我们正在将新的节点插入到视图数中,那么 inserting=true

设计模式学习笔记

Jetpact Compose状态管理简单理解,如何保证高可用

设计模式系列学习视频

Jetpact Compose状态管理简单理解,如何保证高可用

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**

本文已被腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中…

设计模式系列学习视频

[外链图片转存中…(img-f625GLUb-1631256945003)]

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**

本文已被腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录,自学资源及系列文章持续更新中…

上一篇:Python_控制语句(嵌套循环案例)


下一篇:js加载优化三