Jetpact Compose状态管理简单理解,2021最新大厂高频微服务面试总结

本文深入解析Jetpack Compose的状态管理,包括remember、mutableStateOf、rememberSaveable等方法的使用,以及如何从Livedata、Flow、RxJava转换状态。同时,文章总结了2021年大厂面试中关于Android移动开发的高频知识点,强调状态提升和配置变更时的状态保存策略。
摘要由CSDN通过智能技术生成

所谓的状态可以简单的理解为应用中的某个值的变化,比如可以是一个布尔值、数组

放在业务的场景中,可以是 TextField 中的文字、动画执行的状态、用户收藏的商品都是状态

我们知道 compose 是声明式的 ui,每次我们重组页面的时候都会把组件重组,此时就需要引入状态进行管理,例如:

我们在商品的 item 里面点击按钮收藏了商品,此时商品的收藏状态发生了改变,我们需要重组 ui 将商品变为已收藏状态,这个时候就需要用 remember 扩展方法保存重组状态,如果使用 boolean 这个基本类型保存那么就无法在重组 ui 后正常的设置组件的状态。

代码举例(抄官方代码):

@Composable

fun HelloContent() {

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

OutlinedTextField(

value = “输入的值”,

onValueChange = { },

label = { Text(“Name”) }

)

}

}

运行上面的代码,我们会发现无论我们如何在 TextField 中输入内容,TextFile 的内容都不会变,这就是因为无法保存状态导致的,以下代码示例可以正常的改变 TextField 中的内容

@Composable

fun textFieldStateHasTextShow(){

var value by remember {//这里就是对TextField中展示的文字进行状态保存的操作

mutableStateOf("")

}

Box(modifier = Modifier.fillMaxSize(1f),contentAlignment = Alignment.Center) {

OutlinedTextField(

value = value,

onValueChange = {

value=it//每次输入内容的时候,都回调这个更新状态,从而刷新重组ui

},

label = { Text(“Name”) }

)

}

}

状态管理的常用方法


remember 重组中保存状态

组合函数可以通过remember记住单个对象,系统会在初始化期间将remember初始的值存储在组合中。重组的时候可以返回对象值,remember既可以用来存储可变对象又可以存储不可变的对象

当可组合项被移除后,会忘记 remember 存储的对象。

mutableStateOf

mutableStateOf 会创建可观察的 MutableState<T>,例如如下代码: data 就是一个MutableState对象

每当data.value值发生改变的时候,系统就会重组ui。

var data = remember {

mutableStateOf("")

}

注:mutableStateOf 必须使用 remember 嵌套才能在数据更改的时候重组界面

rememberSaveable 保存配置

remember可以帮助我们在界面重组的时候保存状态,而rememberSaveable可以帮助我们存储配置更改(重新创建activity或进程)时的状态。

Livedata、Flow、RxJava 转换为状态

这三个框架是安卓常用的三个响应式开发框架,都支持转化为State对象,以 Flow 举例,如下代码可以转化为一个 State:

val favorites = MutableStateFlow<Set>(setOf())

val state = favorites.collectAsState()

状态管理


有状态和无状态

使用 remember、rememberSaveState 方法保存状态的组合项是有状态组合

反之是无状态组合

状态提升

如下代码是官方关于状态提升的代码:

本例代码中 HelloContent 是无状态的,它的状态被提升到了 HelloScreen 中,HelloContent 有nameonNameChange两个参数,name 是状态,通过 HelloScreen 组合项传给 HelloContent

而 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值