当前位置: 首页 > news >正文

【每日学点鸿蒙知识】节点析构问题、区分手机和pad、 Navigation路由问题、Tabs组件宽度、如何监听Map

1、HarmonyOS 只调用根节点的dispose,是否其下的子节点都能析构掉还是需要遍历子节点,都执行dispose才能正常析构?

前端持有引用关系的需要dispose,new出来的builderNode和FrameNode也需要dispose。只调用根节点的dispose,无法保证其下的子节点能够正常释放

2、HarmonyOS 如何在Web UserAgent中区分手机设备与pad设备?

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/multi-faq-V5#ZH-CN_TOPIC_0000001884757262__%E5%A6%82%E4%BD%95%E6%9F%A5%E8%AF%A2%E8%AE%BE%E5%A4%87%E7%B1%BB%E5%9E%8B

  1. 通过命令行的方式查询设备类型。
    通过命令行查询指定系统参数(const.product.devicetype)进而确定设备类型
 # 方法一hdc shell param get "const.product.devicetype"# 方法二hdc shell cat /etc/param/ohos.para | grep const.product.devicetype
  1. 在应用开发过程中查询设备类型。
 import { deviceInfo } from'@kit.BasicServicesKit'@Entry@Componentstruct GetDeviceTypeSample {@State deviceType:string='unknown'aboutToAppear() {this.deviceType= deviceInfo.deviceType}build() {Column() {Text(this.deviceType).fontSize(24)}.width('100%').height('100%')}
}
3、HarmonyOS Navigation路由问题?

在Index页面跳转PageOne页面的同时隐藏了导航页(hideNavBar),但是在PageOne页面返回上一页时,为什么会出现白屏的情况?

// Index.ets
@Entry
@Component
struct Index {@State hideNavBar: boolean = falseprivate pageStack: NavPathStack = new NavPathStack()build() {Navigation(this.pageStack) {Column() {Button('跳转PageOne,隐藏NavBar').onClick(() => {this.hideNavBar = truethis.pageStack.replacePath({name: 'PageOne'})})}.height('100%').justifyContent(FlexAlign.Center)}.hideNavBar(this.hideNavBar).hideTitleBar(true).hideBackButton(true)}
}// PageOne.ets
@Builder
function PageOneBuilder() {PageOne()
}@Component
export struct PageOne {pageStack: NavPathStack | null = nullbuild() {NavDestination() {Column() {Button('返回上一页').onClick(() => {// 这里返回上一页this.pageStack?.pop?.()})}.height('100%')}.hideTitleBar(true).onReady((ctx: NavDestinationContext) => {this.pageStack = ctx.pathStack})}
}

api介绍:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-navigation-navigation-V5

白屏的情况是隐藏了导航页Navigation导致 hideNavBar(true),设置为false回去就能看到上一个界面的导航页按钮。可以在Navigation上加一个button组件,在返回即使隐藏了Navigation也能看到button组件。具体使用再参考下api文档。

4、HarmonyOS Tabs组件宽度问题?

文档显示Tabs组件的指示器和视图的宽度一样,app首页的会有很多栏目,在栏目的右边会有一个半透明的遮盖条和一个按钮,在这里有办法分开写吗?或者有其他的组件可以替代,这个会影响操作,最后的一两个栏目可能会点不到。

参考以下demo:

@Entry
@Component
struct tabTest {@State tabArray: Array<number> = [0, 1, 2, 3,4]@State focusIndex: number = 0@State pre: number = 0@State index: number = 0private controller: TabsController = new TabsController()@State test: boolean = false@State animationDuration: number = 300@State indicatorLeftMargin: number = 0@State indicatorWidth: number = 0private tabsWidth: number = 0private tabWidth: number = 0;private scrollerForScroll: Scroller = new Scroller()// 单独的页签@BuilderTab(tabName: string, tabItem: number, tabIndex: number) {Row({ space: 20 }) {Text(tabName).fontSize(18).fontColor(tabIndex === this.focusIndex ? Color.Blue :Color.Black).id(tabIndex.toString()).onAreaChange((oldValue: Area,newValue: Area) => {if (this.focusIndex === tabIndex && (this.indicatorLeftMargin === 0 || this.indicatorWidth === 0)){if (newValue.position.x != undefined) {let positionX = Number.parseFloat(newValue.position.x.toString())this.indicatorLeftMargin = Number.isNaN(positionX) ? 0 : positionX}let width = Number.parseFloat(newValue.width.toString())this.tabWidth = Number.isNaN(width) ? 0 : widththis.indicatorWidth = this.tabWidth}})}.justifyContent(FlexAlign.Center).constraintSize({ minWidth: 35 }).width(100).height(30).onClick(() => {this.controller.changeIndex(tabIndex)this.focusIndex = tabIndex}).backgroundColor("#ffb7b7b7")}@BuildertextTest(textName:string){Row({ space: 20 }) {Text(textName).fontSize(18)}.justifyContent(FlexAlign.Center).constraintSize({ minWidth: 35 }).height(30).backgroundColor("#ffb7b7b7")}build() {Column() {Stack({ alignContent: Alignment.TopStart }) {Column() {// 页签Row({ space: 8 }) {List({ space: 20, initialIndex: 0, scroller: this.scrollerForScroll }) {ForEach(this.tabArray, (item: number, index: number) => {ListItem() {this.Tab("页签 " + item, item, index)}}, (item: string) => item)}.listDirection(Axis.Horizontal).height(30).width('80%').friction(0.6).alignListItem(ListItemAlign.Start).scrollBar(BarState.Off).width('80%').backgroundColor("#ffb7b7b7").onScroll((xOffset: number, yOffset: number) => {this.indicatorLeftMargin -= xOffset})this.textTest('更多')}.alignItems(VerticalAlign.Bottom).width('100%').backgroundColor("#ffb7b7b7")}.alignItems(HorizontalAlign.Start).width('100%')Column().height(2).width(this.indicatorWidth).margin({ left: this.indicatorLeftMargin, top:30}).backgroundColor(Color.Blue)Column().height(10).width("20%").margin({ left: '80%', top:28}).backgroundColor("#ffb7b7b7")}.height(40).width('100%').backgroundColor("#ffb7b7b7")//tabsTabs({ barPosition: BarPosition.Start, controller: this.controller }) {ForEach(this.tabArray, (item: number, index: number) => {TabContent() {Text('我是页面 ' + item + " 的内容").height(300).width('100%').fontSize(30)}.backgroundColor(Color.White)}, (item: string) => item)}.onAreaChange((oldValue: Area,newValue: Area)=> {let width = Number.parseFloat(newValue.width.toString())this.tabsWidth = Number.isNaN(width) ? 0 : width}).width('100%').barHeight(0).animationDuration(100).onChange((index: number) => {console.log('foo change')this.focusIndex = indexthis.scrollerForScroll.scrollToIndex(index-1,true)}).onAnimationStart((index: number, targetIndex: number, event: TabsAnimationEvent) => {// 切换动画开始时触发该回调。下划线跟着页面一起滑动this.focusIndex = targetIndexlet targetIndexInfo = this.getTextInfo(targetIndex)this.startAnimateTo(this.animationDuration, targetIndexInfo.left, targetIndexInfo.width)}).onAnimationEnd((index: number,event: TabsAnimationEvent) => {// 切换动画结束时触发该回调。下划线动画停止。let currentIndicatorInfo = this.getCurrentIndicatorInfo(index,event)this.startAnimateTo(0,currentIndicatorInfo.left,currentIndicatorInfo.width)}).onGestureSwipe((index: number,event: TabsAnimationEvent) => {// 在页面跟手滑动过程中,逐帧触发该回调。let currentIndicatorInfo = this.getCurrentIndicatorInfo(index,event)this.focusIndex = currentIndicatorInfo.indexthis.indicatorLeftMargin = currentIndicatorInfo.leftthis.tabWidth = currentIndicatorInfo.widththis.indicatorWidth = currentIndicatorInfo.width})}.height('100%')}private getTextInfo(index: number): Record<string, number> {let strJson = getInspectorByKey(index.toString())try {let obj: Record<string, string> = JSON.parse(strJson)let rectInfo: number[][] = JSON.parse('[' + obj.$rect + ']')return { 'left': px2vp(rectInfo[0][0]), 'width': px2vp(rectInfo[1][0] - rectInfo[0][0]) }} catch (error) {return { 'left': 0, 'width': 0 }}}private getCurrentIndicatorInfo(index: number, event: TabsAnimationEvent): Record<string, number> {let nextIndex = indexif (index > 0 && event.currentOffset > 0) {nextIndex--} else if (index < 4 && event.currentOffset < 0) {nextIndex++}let indexInfo = this.getTextInfo(index)let nextIndexInfo = this.getTextInfo(nextIndex)let swipeRatio = Math.abs(event.currentOffset / this.tabsWidth)let currentIndex = swipeRatio > 0.5 ? nextIndex : index  // 页面滑动超过一半,tabBar切换到下一页。let currentLeft = indexInfo.left + (nextIndexInfo.left - indexInfo.left) * swipeRatiolet currentWidth = indexInfo.width + (nextIndexInfo.width - indexInfo.width) * swipeRatioreturn { 'index': currentIndex, 'left': currentLeft, 'width': currentWidth }}private startAnimateTo(duration: number, leftMargin: number, width: number) {animateTo({duration: duration, // 动画时长curve: Curve.Linear, // 动画曲线iterations: 1, // 播放次数playMode: PlayMode.Normal, // 动画模式onFinish: () => {console.info('play end')}}, () => {this.indicatorLeftMargin = leftMarginthis.tabWidth = widththis.indicatorWidth = width})}
}
5、HarmonyOS 如何监听Map?

可以用@State来修饰Map变量,现在支持Map、Set类型 但是不支持HashMap。

相关文章:

【每日学点鸿蒙知识】节点析构问题、区分手机和pad、 Navigation路由问题、Tabs组件宽度、如何监听Map

1、HarmonyOS 只调用根节点的dispose,是否其下的子节点都能析构掉还是需要遍历子节点&#xff0c;都执行dispose才能正常析构&#xff1f; 前端持有引用关系的需要dispose&#xff0c;new出来的builderNode和FrameNode也需要dispose。只调用根节点的dispose,无法保证其下的子节…...

敏捷测试文化的转变

敏捷文化是敏捷测试转型的基础&#xff0c;只有具备敏捷文化的氛围&#xff0c;对组织架构、流程和相关测试实践的调整才能起作用。在前面的敏捷测试定义中&#xff0c;敏捷测试是遵从敏捷软件开发原则的一种测试实践&#xff0c;这意味着敏捷的价值观。 此外&#xff0c;从传…...

如何配置线程池参数,才能创建性能最好、最稳定的Spring异步线程池?

配置性能最好、最稳定的Spring异步线程池&#xff0c;需要综合考虑业务场景、硬件资源&#xff08;CPU核心数、内存等&#xff09;、并发量、任务特性&#xff08;CPU密集型、IO密集型等&#xff09;以及线程池参数。 以下是优化线程池配置的关键点及代码示例&#xff1a; 线程…...

【时间之外】IT人求职和创业应知【80】-特殊日子

目录 北京冬季招聘会 OpenAI CEO炮轰马斯克 英伟达推出全新AI芯片B300 莫欢喜&#xff0c;总成空。本周必须要谨行慎言。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如提升自己。提升自己的捷径就是学习和思考…...

Vue中接入萤石等直播视频(更新中ing)

一、萤石&#xff1a; 1. 萤石云开发文档&#xff1a; https://open.ys7.com/help/31 2、安装&#xff1a; npm install ezuikit-js --save 3、在文件中引用&#xff1a;import EZUIKit from ezuikit-js 4、具体代码&#xff1a; 获取accessToken&#xff1a;https://open.…...

如何学习、使用Ai,才能跟上时代的步伐?

目录 1. 打好基础&#xff1a;理解AI的核心概念 2. 学习AI的核心领域 3. 实践&#xff1a;动手做项目&#xff0c;积累经验 4. 利用AI工具提升工作效率 5. 培养AI思维与批判性思维 6. 关注AI领域的最新研究与趋势 7. 培养跨学科能力 总结&#xff1a; 在AI时代&#xf…...

RabbitMQ中的异步Confirm模式:提升消息可靠性的利器

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色&#xff0c;它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件&#xff0c;提供了多种机制来确保消息的可靠传递。其中&#xff…...

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…...

upload-labs关卡记录8

黑名单过滤&#xff0c;同时不能进行双写&#xff0c;大小写&#xff0c;特殊可解析后缀&#xff0c;.htaccess,都不能。点击提示发现&#xff1a; 禁止上传所有可解析后缀&#xff0c;抓包试试&#xff1a; 抓包加空格发现也不能绕过&#xff0c;看源码分析吧&#xff1a; $i…...

GXUOJ-算法-第二次作业

1.矩阵连&#xff08;链&#xff09;乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…...

Gavin Wood 的 Polkadot 2024 年度回顾:技术突破与未来的无限可能

原文&#xff1a;https://medium.com/polkadot-network/polkadot-roundup-mmxxiv-8d3e880dd637 作者&#xff1a;Gavin Wood 编译&#xff1a;OneBlock &#x1f384; 各位波卡生态的 Buidler 们&#xff0c;圣诞快乐&#xff01;在这个充满节日气氛的时刻&#xff0c;很高兴与…...

AduSkin、WPF-UI、Prism:WPF 框架全解析与应用指南

摘要: 本文深入探讨了 AduSkin、WPF-UI、Prism 这三个在 WPF 开发领域极具影响力的框架。详细阐述了每个框架的特点、核心功能、安装与配置过程,并通过丰富的代码示例展示其在实际应用场景中的使用方式,包括界面美化、导航与模块管理等方面。同时对它们的优势与局限性进行了…...

【超详细】Git的基本概念和基本使用方式

Git是程序开发中非常重要的工具&#xff0c;是一种分布式版本控制系统&#xff0c;可用于管理和追踪软件开发过程中的变化。那么关于Git的基本操作你知道吗&#xff1f;下面是Git的基本概念和使用方式的解释&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Gi…...

【数据结构】单链表的使用

单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插&#xff1a;****节点尾插&#xff1a;****新节点插入指定节点后&#xff1a;**节点删除&#xff1a; d、单链表修改节点e、单链表遍历&#xff0c;并打印…...

外键约束的应用层维护

1.前言 一般来说 对于不同表格之间的属性约束 我们通常直接使用数据库已经实现好的外键来完成 但是数据库底层实现的外键他的性能很差 这是因为在执行数据库修改操作时 他需要遍历其他所有的表来找出其中可能相关联的属性 一并进行数据库修改(应用层的维护则只需要遍历所有关联…...

springboot整合log4j2日志框架1

目录 一 log4j基本知识 1.1 log4j的日志级别 1.2 log4j的日志文件结构* 1.2.1 概述 1.2.2 详解 1.3 log4j的日志格式化api 1.3.1 api详解 1.3.2 演示案例 1.3.3 演示案例 1.4 log4j中onmatch和onmismatch的区别* 1.4.1 案例 1.4.2 onmatch的api 1.5 logback&#x…...

06 - Django 视图view

HttpRequest 和 HttpResponse Django中的视图主要用来接受Web请求&#xff0c;并做出响应。 视图的本质就是一个Python中的函数 视图的响应分为两大类 以Json数据形式返回(JsonResponse)以网页的形式返回 重定向到另一个网页 (HttpResponseRedirect)错误视图(4XX,5XX) (Htt…...

基于云计算的资源管理系统

基于云计算的资源管理系统是一种将云计算技术与资源管理技术相结合&#xff0c;以实现资源高效利用和管理的系统。以下是对该系统的详细分析&#xff1a; 一、系统概述 云计算是一种基于网络的计算模式&#xff0c;通过将计算资源和数据存储在云端服务器上&#xff0c;使用户…...

从0入门自主空中机器人-3-【环境与常用软件安装】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…...

electron node-api addon开发

解决方案入口 拷贝日志以及json等第三方源码 增加包含目录 编写接口 默认模板已经有一个回调函数了 照葫芦画瓢就行 其中几个重要的点要注意 1.参数传入 比如如下的例子&#xff1a; 头文件定义&#xff1a; public:下增加 Napi::Value StartAnswer (const Napi::Callb…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...