Android笔记【10】

一、前言

        学习课程时,对于自己不懂的点的记录。

二、内容

学习一段代码:

    val drawerState = rememberDrawerState(DrawerValue.Closed)val scope= rememberCoroutineScope()Scaffold (topBar={TopAppBar(navigationIcon = {IconButton(onClick = {scope.launch {drawerState.open() }}) {Icon(currentScreen.value.icon, contentDescription = "${currentScreen.value.route}")}},

1、drawerState.open() 放在协程里

这是在写navigaiton时的一份代码。其中关于drawerState.open() 放在协程里才能不编译出错不理解。查找资料得知:

在这段代码中,使用 scope.launch { drawerState.open() } 是因为 drawerState.open() 是一个挂起函数(suspending function)。这意味着它可能需要等待某些操作完成,比如打开抽屉的动画或状态更新,而不能在普通的上下文中直接调用。

具体原因:

  1. 挂起函数: drawerState.open() 可能会涉及到异步操作,使用协程可以确保在调用时不会阻塞主线程,从而保持应用的流畅性。

  2. 状态管理: 使用协程可以方便地管理状态的变化,确保在打开抽屉的过程中,UI 不会卡顿或冻结。

  3. 最佳实践: 在 Jetpack Compose 中,推荐在协程作用域内处理需要等待的操作,以便更好地控制生命周期和避免内存泄漏。

因此,将 drawerState.open() 放在协程中是为了确保流畅的用户体验和正确的状态管理

2、如何判断drawerState.open()是不是挂起函数?

  1. 查看官方文档

    • 访问 Jetpack Compose 的官方文档,查找 drawerStateopen() 方法的描述,通常会指出该方法是否是挂起函数。
  2. 查看源码

    • 如果你有访问源代码的权限,可以查看 drawerState 的定义和 open() 方法的实现。如果方法签名中有 suspend 关键字,那么它就是一个挂起函数。
    suspend fun open() { ... }
    
  3. IDE 提示

    • 在 Kotlin 开发环境(如 Android Studio)中,尝试将光标悬停在 open() 方法上,IDE 通常会显示该方法的签名。如果它是挂起函数,会有相应的提示。
  4. 尝试编译

    • 尝试在非协程上下文中调用 drawerState.open()。如果编译失败并提示需要在协程中调用,则说明它是一个挂起函数。

结论

通常,使用官方文档和源码是最可靠的方法来判断一个函数是否是挂起函数。

后面看的时候确实有suspend这个关键字

3、val drawerState = rememberDrawerState(DrawerValue.Closed)

rememberDrawerState 和其他 remember 函数(如 remember)在 Jetpack Compose 中都有相似的作用,即在组合函数的重新组合过程中保持状态,但它们的用途和实现细节略有不同。

1. remember 函数

  • 用途:用于在组合函数中保存任意类型的状态。可以用来存储基本类型、对象或其他任何需要保持的值。
  • 示例
    val counter = remember { mutableStateOf(0) }
    

2. rememberDrawerState 函数

  • 用途:专门用于创建和管理 DrawerState 的状态。它返回一个 DrawerState 对象,适用于侧滑抽屉组件的状态管理。
  • 示例
    val drawerState = rememberDrawerState(DrawerValue.Closed)
    
  • 特点:这个函数封装了一些与抽屉状态相关的逻辑,确保在状态变化时能正确处理抽屉的开关和动画等。

总结

  • remember 是一个通用的状态保存函数,可以用于任何类型的状态。
  • rememberDrawerState 是一个特定于抽屉组件的状态管理函数,用于创建和管理抽屉的状态,简化了与抽屉相关的操作和逻辑。

使用 rememberDrawerState 可以更方便地处理与抽屉相关的状态,而使用 remember 则提供了更大的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)

系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,Name=Value) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文…

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

scss文件内引入其他scss文件报错

在 Sass (SCSS) 中,import 语句用于在当前文件中导入其他 Sass 文件,以便你可以重用样式和变量等。然而,从 Dart Sass 1.23.0 版本开始,import 语句已经被标记为弃用(deprecated),并计划在未来的…

Day28 贪心算法 part02

122.买卖股票的最佳时机II 本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜! class Solution {public int maxProfit(int[] prices) {//分析每一天的情况。只要保证今天买,明天卖可以不亏钱,那就是最大的利润。把每一天可以赚钱的机会都不放过,先把能挣…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能,自己研究了下。 1.其中向量角度计算: 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向,从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

【MATLAB】基于RSSI的蓝牙定位与例程,设置4个基站、二维定位

目录 ​编辑 商品描述 主要功能 技术细节 适用场景 下载链接 商品描述 这款基于接收信号强度指示(RSSI)原理的蓝牙定位程序,专为需要高效、可靠定位解决方案的开发者和研究人员设计。它能够在二维平面内,通过4个锚点实现对未…

npm 最新国内淘宝镜像地址源 (旧版已不能用)

注意:原域名https://registry.npm.taobao.org/ 在 2022.06.30 号正式下线和停止 DNS 解析 最新地址: #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 查看镜像使用状态 npm config get registr…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

单链表---移除链表元素

对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…

ROC曲线

文章目录 前言一、ROC的应用?二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中,ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异,例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…

10)语法分析:介词辨析

1. For 主要用法&#xff1a; 目的或原因&#xff1a;表示做某事的目的或原因。 Example: I am studying for the exam. (我在为考试学习。)Example: She bought a gift for her friend. (她为她的朋友买了一份礼物。) 持续时间&#xff1a;表示某个动作或状态的持续时间。 Ex…

第一届“吾杯”网络安全技能大赛 Writeup

战队信息 战队名称&#xff1a;在你眼中我是誰&#xff0c;你想我代替誰&#xff1f; 战队排名&#xff1a;13 Misc Sign Hex 转 Str&#xff0c;即可得到flag。 原神启动&#xff01; 不好评价&#xff0c;stegsolve 秒了&#xff1a; WuCup{7c16e21c-31c2-439e-a814-b…

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…

深入学习MapReduce:原理解析与基础实战

标题&#xff1a;深入学习MapReduce&#xff1a;原理解析与基础实战 MapReduce是一种分布式计算框架&#xff0c;用于大规模数据的处理和分析。作为Hadoop生态系统的核心组件&#xff0c;MapReduce凭借其简单的编程模型和强大的并行计算能力&#xff0c;广泛应用于大数据领域。…

鸿蒙HarmonyOS学习笔记(6)

定义扩展组件样式&#xff1a;Extend装饰器 在前文的示例中&#xff0c;可以使用Styles用于样式的重用&#xff0c;在Styles的基础上&#xff0c;我们提供了Extend&#xff0c;用于扩展原生组件样式。 说明 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 从…

Chrome DevTools Protocol 进阶:Runtime 域

前言 在 Chrome DevTools Protocol&#xff08;CDP&#xff09;中&#xff0c;Runtime 域是一个非常重要的部分&#xff0c;它主要用于与 JavaScript 的执行环境进行交互。通过 Runtime 域&#xff0c;开发者可以在页面上下文中执行 JavaScript 代码、评估表达式、捕获异常等操…

Android 亮度调节

frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java 更新屏幕亮度值Settings.System.SCREEN_BRIGHTNESS BrightnessController.java中有个onChanged事件&#xff0c;这个是更新 setBrightness(val) private void setBrightness(i…