Compose 生命周期和副作用

2024-05-08 22:52

本文主要是介绍Compose 生命周期和副作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Compose 生命周期和副作用
    • 生命周期
    • 副作用API
      • DisposableEffect
      • SIdeEffect
      • LaunchedEffect
      • rememberCoroutineScope
      • rememberUpdatedState
      • snapshotFlow
      • produceState
      • derivedStateOf

Compose 生命周期和副作用

生命周期

在这里插入图片描述

  • OnActive:添加到视图树。即Composable被首次执行,在视图树上创建对应的节点。
  • OnUpdate:重组。Composable跟随重组不断执行,更新视图树上的对应节点。
  • OnDispose:从视图树移除。Composable不再被执行,对应节点从视图树上移除。

Composable在角色上更加类似于传统视图的View,所以没有Activity或者Fragment那样的前后台切换的概念,生命周期相对简单。

副作用API

副作用(Side-Effects):指在 Composable 函数中执行的可能会产生外部影响或依赖于外部资源的操作。如,访问数据库、网络请求、文件操作、弹出Toast、保存本地文件、访问远程或本地数据等。

重组可能会造成Composable频繁反复执行,副作用不应该跟随重组反复执行的。

为了处理副作用,Android Compose 提供了一系列副作用API。

DisposableEffect

DisposableEffect 可以感知 Composable 的 onActive 和 onDispose,允许通过副作用完成一些预处理和收尾处理。

@Composable
fun LifecyclePage() {var counter by remember { mutableStateOf(0) }Column(horizontalAlignment = Alignment.CenterHorizontally) {Text("Counter: ${counter}")Row {Button(onClick = { counter-- }) {Text("-")}Button(onClick = { counter++ }) {Text("+")}}}DisposableEffect(Unit) {Log.e("TAG", "预处理")counter = 100onDispose {Log.e("TAG", "销毁处理")}}
}

SIdeEffect

SIdeEffect 会在重组成功时执行,不适合处理那些耗时或者异步的副作用逻辑。

@Composable
fun LifecyclePage() {var counter by remember { mutableStateOf(0) }Column(horizontalAlignment = Alignment.CenterHorizontally) {Text("Counter: ${counter}")Row {Button(onClick = { counter-- }) {Text("-")}Button(onClick = { counter++ }) {Text("+")}}}SideEffect {Log.e("TAG", "hello 重组了")}
}

LaunchedEffect

用于异步操作。

当 Composable 进入 OnActive 时,LaunchedEffect 会启动协程执行 block 中的内容,可以在其中启动子协程或者调用挂起函数。当Composable 进入 OnDispose 时,协程会自动取消,因此 LaunchedEffect 不需要实现OnDispose{…}。

@Composable
fun LifecyclePage() {var counter by remember { mutableStateOf(0) }Column(horizontalAlignment = Alignment.CenterHorizontally) {Text("Counter: ${counter}")Row {Button(onClick = { counter-- }) {Text("-")}Button(onClick = { counter++ }) {Text("+")}}}LaunchedEffect(Unit) {async {delay(2000L)Log.e("TAG", "异步处理")counter = 2000}}
}

rememberCoroutineScope

协程操作。

LaunchedEffect 虽然可以启动协程,但是只能在 Composable 中调用。如果想在非 Composable 中使用协程,如点击事件中,可以使用 rememberCoroutineScope。

rememberCoroutineScope 会返回一个 CoroutineScope,并在 OnDispose 时自动取消。

@Composable
fun LifecyclePage() {var counter by remember { mutableStateOf(0) }val scope = rememberCoroutineScope()Column(horizontalAlignment = Alignment.CenterHorizontally) {Text("Counter: ${counter}")      Button(onClick = {scope.launch {Log.e("TAG", "协程操作")counter = 3000}}) {Text("协程操作")}} 
}

rememberUpdatedState

监听状态最新状态。

rememberUpdatedState的实现就明白其中原理了,其实就是remember和mutableStateOf的组合使用

@Composable
fun LifecyclePage() {var counter by remember { mutableStateOf(0) }val updateCounter by rememberUpdatedState(newValue = counter)Column(horizontalAlignment = Alignment.CenterHorizontally) {Text("Counter: ${counter}")Row {Button(onClick = { counter-- }) {Text("-")}Button(onClick = { counter++ }) {Text("+")}} Text("监听最新状态:${updateCounter}")}
}

snapshotFlow

snapshotFlow 可以把 Compose 的 State 状态对象转成协程的 Flow。

@Composable
fun LifecyclePage() {var time by remember { mutableStateOf("${System.currentTimeMillis()}") }val flow = snapshotFlow { time }Column(horizontalAlignment = Alignment.CenterHorizontally) {Button(onClick = {time = "${System.currentTimeMillis()}"}) {Text("更新")}}LaunchedEffect(Unit) {flow.collect {Log.e("TAG", "snapshotFlow: ${it}")}}
}

produceState

SideEffect 常用来将Compose的State暴露给外部使用,而produceState则相反,可以将一个外部的数据源转成State。外部数据源可以是一个LiveData或者RxJava这样的可观察数据,也可以是任意普通的数据类型。

data class Person(val name: String, val age: Int, val time: Long)@Composable
fun MyProduceState() {var name by remember { mutableStateOf("小明") }var age by remember { mutableStateOf(18) }val personState by produceState(initialValue = Person(name, age, System.currentTimeMillis()),name,age) {value = Person(name, age, System.currentTimeMillis())}Column(horizontalAlignment = Alignment.CenterHorizontally) {Button(onClick = { name = "小红" }) {Text("修改name")}Button(onClick = { age = 19 }) {Text("修改age")}Text("produceState: ${personState}")}
}

说明:修改 name 或 age 都会触发 produceState。

derivedStateOf

derivedStateOf用来将一个或多个State转成另一个State。derivedStateOf{…}的block中可以依赖其他State创建并返回一个DerivedState,当block中依赖的State发生变化时,会更新此DerivedState,依赖此DerivedState的所有Composable会因其变化而重组。

@Composable
fun MyDerivedStateOf() {var postList by remember { mutableStateOf(listOf("a", "b", "c", "d", "e")) }var keyword by remember { mutableStateOf("") }val result by remember {derivedStateOf { postList.filter { it.contains(keyword, false) } }}Text("过滤:${result}")Button(onClick = { postList = listOf("1", "2", "3", "4", "5") }) {Text("修改List")}OutlinedTextField(value = keyword, onValueChange = { keyword = it }, label = { Text("请输入") })
}

说明:当 postList 或 keyword 方式变化时,derivedStateOf 都会重新计算,result 也就更新了。

这篇关于Compose 生命周期和副作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971668

相关文章

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c

【Vue】关于Vue3的生命周期

目录 Vue3中新增了一个setup生命周期函数:(1) setup执行的时机是在beforeCreate生命周期函数之前执行,在setup函数中是不能通过this来获取实例的;(2) 为了命名的统一性,将beforeDestroy 改名为 beforeUnmount,destroyed 改名为 unmounted 生命周期函数: setup —— 不能通过this来获

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

Docker Compose使用手册

Docker Compose是一个比较简单的docker容器的编配工具,以前的名称叫Fig,由Orchard团队开发的开源Docker编配工具,在2014年被Docker公司收购,Docker Compose是使用Python语言开发的一款docker编配工具。使用Docker Compose,可以用一个yml文件定义一组要启动的容器,以及容器运行时的属性。Docker Compose称这些容器为

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)

记录下,使用 docker-compose 安装 Elasticsearch 和 Kibana,并配置 IK 分词器,你可以按照以下步骤进行。此过程适用于 Elasticsearch 和 Kibana 8.10.4 版本。 安装 首先,在你的工作目录下创建一个 docker-compose.yml 文件,用于配置 Elasticsearch 和 Kibana 的服务。 version:

Docker-Compose for Linux安装

Docker-Compose for Linux安装 1.前言2.安装Docker-Compose 1.前言 我们为什么要使用docker-compose? 我们运行一个docker镜像,需要添加大量的参数。 现在我们可以通过docker-compose编写这些参数。 Docker-Compose可以帮助我们批量管理这些容器。 我们只需要通过一个docker-compos

【前端】animation动画以及利用vue制作简单的透明度改变动画,包含vue生命周期实现

一. 问题描述 想做一个文字透明度从1到0然后再从0到1的css动画。 二. 代码写法 2.1 animation写法 2.1.1 animation属性key 2.1.2 代码展示 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=de