ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-10 15:01:04  阅读:168  来源: 互联网

标签:City rememberSaveable Compose String val 可用 源码 Jetpact name


而 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

rememberedValue 就是数据转换的逻辑

  • rememberedValue 方法解析

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

设计模式学习笔记

设计模式系列学习视频

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

)**

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

设计模式系列学习视频

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

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

)**

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

标签:City,rememberSaveable,Compose,String,val,可用,源码,Jetpact,name
来源: https://blog.csdn.net/m0_61369275/article/details/120222167

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有