「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
- LiveData 是一种可观察的数据存储器类
- State 一种方式是使用
state{...}
方法声明初始状态,并监听状态变化。当状态变化时,会触发recomposition
执行从而刷新UI - Flow和Compose并没有直接关系,只是Flow可以转换为LiveData或者State
我用一个文本和一个输入框来演示
@Composable
internal fun TextField(title: String, onNameChange: (String) -> Unit) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "标题 :$title",
modifier = Modifier.padding(bottom = 8.dp),
)
OutlinedTextField(
value = title,
onValueChange = { onNameChange(it) },
label = { Text("请输入") }
)
}
}
LiveData
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力
数据变更进行通知,但是数据通知只发生在生命周期活跃状态 STARTED、RESUMED) \
使用方法
导入依赖
// LiveData & ViewModel
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
创建 LiveData
的实例以存储某种类型的数据。这通常在 ViewModel
类中完成。
class LiveDataViewModel : ViewModel() {
private val input = MutableLiveData("")
val title: LiveData<String> = input
//接收输入框传进来的内容
fun onTitleChange(msg: String) {
//告诉MutableLiveData数据发生了改变
input.value = msg
}
}
这时候通过observeAsState来观察title是否变化,如果变化就会通知UI更新
@Composable
fun LiveDataDemo(viewModel: LiveDataViewModel = viewModel()) {
val title by viewModel.title.observeAsState("")
TextField(title) {
//传出输入的内容
viewModel.onTitleChange(it)
}
}
State
返回用传入值初始化的新可变状态 MutableState类是单个值持有者,其读写操作由Compose观察。此外,对它的写入作为片段的一部分进行处理。
值持有者,在可组合函数执行期间读取value属性,当前的重新定位作用域将订阅该值的更改。
class StateViewModel : ViewModel() {
var title: String by mutableStateOf("")
private set
fun onNameChange(msg: String) {
title = msg
}
}
@Composable
fun StateDemo(viewModel: StateViewModel = viewModel()) {
val title = viewModel.title
TextField(title) {
viewModel.onNameChange(it)
}
}
Flow
Flow创建具有给定初始值的可变状态流。
Compose可以在不导入依赖的情况下简单使用,用法基本与相同。
MutableStateFlow
实现了数据监听,当更新MutableStateFlow
值的时候函数会被刷新,然后使用collectAsState
从该状态流收集值,并通过状态表示其最新值。值用作初始值。每次有新值发布到StateFlow中时,返回的状态都会被更新,从而导致每个状态的重新更新
class FlowViewModel : ViewModel() {
private val input = MutableStateFlow("")
val title: StateFlow<String> = input
fun onNameChange(msg: String) {
input.value = msg
}
}
@Composable
private fun FlowExample(viewModel: FlowViewModel = viewModel()) {
val title: String by viewModel.title.collectAsState()
TextField(title) { viewModel.onNameChange(it) }
}
不放效果图的都是水贴