Jetpack Compose LiveData State Flow 的使用

4,123 阅读2分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

  1. LiveData 是一种可观察的数据存储器类
  2. State 一种方式是使用state{...}方法声明初始状态,并监听状态变化。当状态变化时,会触发recomposition执行从而刷新UI
  3. 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("请输入") }
        )
    }
}

3c1abf88c08d8cc6b1a76180e1d854c.jpg

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

不放效果图的都是水贴

video_220205_230328.gif