【每日学点鸿蒙知识】节点析构问题、区分手机和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
- 通过命令行的方式查询设备类型。
通过命令行查询指定系统参数(const.product.devicetype)进而确定设备类型
# 方法一hdc shell param get "const.product.devicetype"# 方法二hdc shell cat /etc/param/ohos.para | grep const.product.devicetype
- 在应用开发过程中查询设备类型。
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,是否其下的子节点都能析构掉还是需要遍历子节点,都执行dispose才能正常析构? 前端持有引用关系的需要dispose,new出来的builderNode和FrameNode也需要dispose。只调用根节点的dispose,无法保证其下的子节…...
敏捷测试文化的转变
敏捷文化是敏捷测试转型的基础,只有具备敏捷文化的氛围,对组织架构、流程和相关测试实践的调整才能起作用。在前面的敏捷测试定义中,敏捷测试是遵从敏捷软件开发原则的一种测试实践,这意味着敏捷的价值观。 此外,从传…...
如何配置线程池参数,才能创建性能最好、最稳定的Spring异步线程池?
配置性能最好、最稳定的Spring异步线程池,需要综合考虑业务场景、硬件资源(CPU核心数、内存等)、并发量、任务特性(CPU密集型、IO密集型等)以及线程池参数。 以下是优化线程池配置的关键点及代码示例: 线程…...
【时间之外】IT人求职和创业应知【80】-特殊日子
目录 北京冬季招聘会 OpenAI CEO炮轰马斯克 英伟达推出全新AI芯片B300 莫欢喜,总成空。本周必须要谨行慎言。 感谢所有打开这个页面的朋友。人生不如意,开越野车去撒野,会害了自己,不如提升自己。提升自己的捷径就是学习和思考…...
Vue中接入萤石等直播视频(更新中ing)
一、萤石: 1. 萤石云开发文档: https://open.ys7.com/help/31 2、安装: npm install ezuikit-js --save 3、在文件中引用:import EZUIKit from ezuikit-js 4、具体代码: 获取accessToken:https://open.…...
如何学习、使用Ai,才能跟上时代的步伐?
目录 1. 打好基础:理解AI的核心概念 2. 学习AI的核心领域 3. 实践:动手做项目,积累经验 4. 利用AI工具提升工作效率 5. 培养AI思维与批判性思维 6. 关注AI领域的最新研究与趋势 7. 培养跨学科能力 总结: 在AI时代…...
RabbitMQ中的异步Confirm模式:提升消息可靠性的利器
在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件,提供了多种机制来确保消息的可靠传递。其中ÿ…...
Linux(Centos 7.6)目录结构详解
Linux(Centos 7.6)是一个操作系统,其核心设计理念是将一切资源抽象为文件,即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…...
upload-labs关卡记录8
黑名单过滤,同时不能进行双写,大小写,特殊可解析后缀,.htaccess,都不能。点击提示发现: 禁止上传所有可解析后缀,抓包试试: 抓包加空格发现也不能绕过,看源码分析吧: $i…...
GXUOJ-算法-第二次作业
1.矩阵连(链)乘 问题描述 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 年度回顾:技术突破与未来的无限可能
原文:https://medium.com/polkadot-network/polkadot-roundup-mmxxiv-8d3e880dd637 作者:Gavin Wood 编译:OneBlock 🎄 各位波卡生态的 Buidler 们,圣诞快乐!在这个充满节日气氛的时刻,很高兴与…...
AduSkin、WPF-UI、Prism:WPF 框架全解析与应用指南
摘要: 本文深入探讨了 AduSkin、WPF-UI、Prism 这三个在 WPF 开发领域极具影响力的框架。详细阐述了每个框架的特点、核心功能、安装与配置过程,并通过丰富的代码示例展示其在实际应用场景中的使用方式,包括界面美化、导航与模块管理等方面。同时对它们的优势与局限性进行了…...
【超详细】Git的基本概念和基本使用方式
Git是程序开发中非常重要的工具,是一种分布式版本控制系统,可用于管理和追踪软件开发过程中的变化。那么关于Git的基本操作你知道吗?下面是Git的基本概念和使用方式的解释: 仓库(Repository):Gi…...
【数据结构】单链表的使用
单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插:****节点尾插:****新节点插入指定节点后:**节点删除: d、单链表修改节点e、单链表遍历,并打印…...
外键约束的应用层维护
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请求,并做出响应。 视图的本质就是一个Python中的函数 视图的响应分为两大类 以Json数据形式返回(JsonResponse)以网页的形式返回 重定向到另一个网页 (HttpResponseRedirect)错误视图(4XX,5XX) (Htt…...
基于云计算的资源管理系统
基于云计算的资源管理系统是一种将云计算技术与资源管理技术相结合,以实现资源高效利用和管理的系统。以下是对该系统的详细分析: 一、系统概述 云计算是一种基于网络的计算模式,通过将计算资源和数据存储在云端服务器上,使用户…...
从0入门自主空中机器人-3-【环境与常用软件安装】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
electron node-api addon开发
解决方案入口 拷贝日志以及json等第三方源码 增加包含目录 编写接口 默认模板已经有一个回调函数了 照葫芦画瓢就行 其中几个重要的点要注意 1.参数传入 比如如下的例子: 头文件定义: public:下增加 Napi::Value StartAnswer (const Napi::Callb…...
SUPER COLORIZER一键部署指南:基于Ubuntu 20.04的完整环境配置教程
SUPER COLORIZER一键部署指南:基于Ubuntu 20.04的完整环境配置教程 你是不是也遇到过一些珍贵的老照片,因为年代久远而褪色,想恢复它原本的色彩却无从下手?或者,你有一些黑白的设计稿,想快速预览上色后的效…...
告别Swagger原生UI!用Knife4j给你的SpringBoot API文档做个‘美容’
从Swagger到Knife4j:打造专业级API文档的终极指南 如果你已经厌倦了Swagger原生UI那千篇一律的界面和笨拙的操作体验,那么是时候给你的API文档来一次全面升级了。在当今这个注重用户体验的时代,一个美观、易用且功能强大的API文档界面&#x…...
Java 25正式支持ZGC 2.0仅剩72小时!你还没掌握这8个颠覆性调优参数?
第一章:ZGC 2.0在Java 25中的里程碑意义与演进全景ZGC 2.0 是 Java 25 中最具突破性的垃圾回收器升级,标志着低延迟 GC 技术从“亚毫秒停顿”正式迈向“纳秒级停顿保障”的新纪元。它不再仅依赖染色指针(Colored Pointers)和读屏障…...
高效解决Magpie插件更新难题:完全掌握图像增强功能升级指南
高效解决Magpie插件更新难题:完全掌握图像增强功能升级指南 【免费下载链接】Magpie An all-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 识别插件更新需求:为何及时升级至关重要 在使用M…...
告别串口线!用STM32F103+W25Q64做个U盘式固件升级器(附完整Keil工程)
STM32SPI Flash打造零门槛U盘固件升级器:从原理到量产实战 在嵌入式设备维护和量产环节,固件升级一直是让开发者头疼的问题。传统串口升级需要专用线缆和上位机软件,而基于STM32和SPI Flash的U盘式升级方案,将复杂的刷机流程简化为…...
别再手动改MTL文件了!一个Python脚本搞定ENVI打开Landsat 8/9 L2影像的报错问题
用Python自动化修复Landsat L2影像的ENVI兼容性问题 遥感数据处理中,Landsat 8/9的L2级别影像在ENVI软件中打开时经常遇到兼容性问题。传统的手动修改MTL文件方法不仅效率低下,还容易出错。本文将介绍一个Python自动化解决方案,帮助您彻底摆脱…...
如何开发Browser MCP自定义工具与资源扩展:完整指南
如何开发Browser MCP自定义工具与资源扩展:完整指南 【免费下载链接】mcp Browser MCP is a Model Context Provider (MCP) server that allows AI applications to control your browser 项目地址: https://gitcode.com/gh_mirrors/mcp16/mcp Browser MCP&a…...
OpenClaw技能组合:GLM-4.7-Flash多功能集成方案
OpenClaw技能组合:GLM-4.7-Flash多功能集成方案 1. 为什么需要技能组合? 去年冬天,我接手了一个内容运营的兼职项目,需要每周整理行业动态、生成分析报告并发布到三个不同平台。最初我尝试手动操作,但很快发现这种重…...
G-Helper:华硕ROG笔记本性能调校的轻量级解决方案
G-Helper:华硕ROG笔记本性能调校的轻量级解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: h…...
M5Stack舵机驱动库:PCA9685硬件PWM控制与多平台移植
1. 项目概述M5Hat-8Servos 是专为 M5Stack 生态设计的硬件驱动库,用于控制 M5Stack 官方推出的HAT-8SERVO扩展模块。该模块基于PCA9685 16通道12位PWM LED与伺服驱动芯片,通过 IC 总线与主控(如 M5Stack Core2、M5Stamp C3、M5Paper 等&#…...
