HarmonyOS 应用开发之自定义组件成员属性访问限定符使用限制

ArkTS会对自定义组件的成员变量使用的访问限定符private/public/protected进行校验,当不按规范使用访问限定符private/public/protected时,会产生对应的日志信息。

说明:
从API version 12开始,支持自定义组件成员属性访问限定符使用限制的规则。

使用限制

  • 对于@State/@Prop/@Provide/@BuilderParam/常规成员变量(不涉及更新的普通变量),当使用private修饰时,在自定义组件构造时,不允许进行赋值传参,否则会有编译告警日志提示。

  • 对于@StorageLink/@StorageProp/@LocalStorageLink/@LocalStorageLink/@Consume变量,当使用public修饰时,会有编译告警日志提示。

  • 对于@Link/@ObjectLink变量,当使用private修饰时,会有编译告警日志提示。

  • 由于struct没有继承能力,上述所有的这些变量使用protected修饰时,会有编译告警日志提示。

  • 当@Require和private同时修饰自定义组件struct的@State/@Prop/@Provide/@BuilderParam/常规成员变量(不涉及更新的普通变量)时,会有编译告警日志提示。

错误使用场景示例

1.当成员变量被private访问限定符和@State/@Prop/@Provide/@BuilderParam装饰器同时修饰时,ArkTS会进行校验并产生告警日志。

@Entry
@Component
struct AccessRestrictions {@Builder buildTest() {Text("Parent builder")}build() {Column() {ComponentsChild({state_value: "Hello", prop_value: "Hello", provide_value: "Hello", builder_value: this.buildTest, regular_value: "Hello"})}.width('100%')}
}@Component
struct ComponentsChild {@State private state_value: string = "Hello";@Prop private prop_value: string = "Hello";@Provide private provide_value: string = "Hello";@BuilderParam private builder_value: () => void = this.buildTest;private regular_value: string = "Hello";@Builder buildTest() {Text("Child builder")}build() {Column() {Text("Hello").fontSize(50).fontWeight(FontWeight.Bold)}}
}

编译告警日志如下:

Property 'state_value' is private and can not be initialized through the component constructor.
Property 'prop_value' is private and can not be initialized through the component constructor.
Property 'provide_value' is private and can not be initialized through the component constructor.
Property 'builder_value' is private and can not be initialized through the component constructor.
Property 'regular_value' is private and can not be initialized through the component constructor.

2.当成员变量被public访问限定符和@StorageLink/@StorageProp/@LocalStorageLink/@LocalStorageLink/@Consume装饰器同时修饰时,ArkTS会进行校验并产生告警日志。

@Entry
@Component
struct AccessRestrictions {@Provide consume_value: string = "Hello";build() {Column() {ComponentChild()}.width('100%')}
}@Component
struct ComponentChild {@LocalStorageProp("sessionLocalProp") public local_prop_value: string = "Hello";@LocalStorageLink("sessionLocalLink") public local_link_value: string = "Hello";@StorageProp("sessionProp") public storage_prop_value: string = "Hello";@StorageLink("sessionLink") public storage_link_value: string = "Hello";@Consume public consume_value: string;build() {Column() {Text("Hello").fontSize(50).fontWeight(FontWeight.Bold)}}
}

编译告警日志如下:

Property 'local_prop_value' can not be decorated with both @LocalStorageProp and public.
Property 'local_link_value' can not be decorated with both @LocalStorageLink and public.
Property 'storage_prop_value' can not be decorated with both @StorageProp and public.
Property 'storage_link_value' can not be decorated with both @StorageLink and public.
Property 'consume_value' can not be decorated with both @Consume and public.

3.当成员变量被private访问限定符和@Link/@ObjectLink装饰器同时修饰时,ArkTS会进行校验并产生告警日志。

@Entry
@Component
struct AccessRestrictions {@State link_value: string = "Hello";@State objectLink_value: ComponentObj = new ComponentObj();build() {Column() {ComponentChild({link_value: this.link_value, objectLink_value: this.objectLink_value})}.width('100%')}
}@Observed
class ComponentObj {count: number = 0;
}
@Component
struct ComponentChild {@Link private link_value: string;@ObjectLink private objectLink_value: ComponentObj;build() {Column() {Text("Hello").fontSize(50).fontWeight(FontWeight.Bold)}}
}

编译告警日志如下:

Property 'link_value' can not be decorated with both @Link and private.
Property 'objectLink_value' can not be decorated with both @ObjectLink and private.

4.当成员变量被protected访问限定符修饰时,ArkTS会进行校验并产生告警日志。

@Entry
@Component
struct AccessRestrictions {build() {Column() {ComponentChild({regular_value: "Hello"})}.width('100%')}
}@Component
struct ComponentChild {protected regular_value: string = "Hello";build() {Column() {Text("Hello").fontSize(50).fontWeight(FontWeight.Bold)}}
}

编译告警日志如下:

The member attributes of a struct can not be protected.

5.当成员变量被private访问限定符、@Require和@State/@Prop/@Provide/@BuilderParam装饰器同时修饰时,ArkTS会进行校验并产生告警日志。

@Entry
@Component
struct AccessRestrictions {build() {Column() {ComponentChild({prop_value: "Hello"})}.width('100%')}
}
@Component
struct ComponentChild {@Require @Prop private prop_value: string = "Hello";build() {Column() {Text("Hello").fontSize(50).fontWeight(FontWeight.Bold)}}
}

编译告警日志如下:

Property 'prop_value' can not be decorated with both @Require and private.
Property 'prop_value' is private and can not be initialized through the component constructor.

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

如何使用极狐GitLab 启用自动备份功能

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何极狐GitLab 自…

OpenCV 笔记(28):图像降噪算法——中值滤波、高斯滤波

1. 图像噪声 图像降噪(Image Denoising)是指从图像中去除噪声的过程,目的是提高图像质量,增强图像的视觉效果。 图像噪声是指图像中不希望出现的随机亮度或颜色变化,通常会降低图像的清晰度和可辨识度,以及会降低图像的质量并使图…

C++中发送HTTP请求的方式

一,简介 使用C编程发送HTTP请求通常需要使用第三方的HTTP库或框架。在C中,有几个受欢迎的HTTP库可供选择,例如Curl、Boost.Beast和cpp-httplib。另外,也可以自己实现socket来发送http请求 二、使用Curl库发送HTTP请求 1. 确认当…

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…

【C++】哈希之位图

目录 一、位图概念二、海量数据面试题 一、位图概念 假如有40亿个无重复且没有排序的无符号整数,给一个无符号整数,如何判断这个整数是否在这40亿个数中? 我们用以前的思路有这些: 把这40亿个数遍历一遍,直到找到为…

4月2号总结

java学习 一.final关键字 final英语翻译过来的意思是“最后,最终”的意思。 在java中,final有三个作用,修饰变量、修饰类、修饰成员方法。 1.修饰变量 final修饰的变量只能被赋值一次,不能被改变。 要是强行去改变final修饰…

服务器端口被扫会发生哪些故障?

在数字化时代,服务器作为支撑各种业务运行的核心基础设施,其安全性至关重要。然而,当服务器的端口被恶意扫描时,可能会引发一系列故障,给企业和个人带来不可估量的损失。那么,服务器端口被扫会发生哪些故障…

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后,我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块,其中quick就是qml了&…

vue3项目运行正常但vscode红色波浪线报错

以下解决办法如不生效,可尝试 重启 vscode 一、Vetur插件检测问题 vetur 是一个 vscode 插件,用于为 .vue 单文件组件提供代码高亮以及语法支持。但 vue 以及 vetur 对于 ts 的支持,并不友好。 1、原因 如下图:鼠标放到红色波浪…

负载均衡集群

一、集群的基本原理 集群:数据内容是一致的,集群可以被替代 分布式:各司其职,每台服务器存储自己独有的数据,对外作为单点被访问是访问整体的数据; 分布式是不能被替代的;分布式分为MFS、GFS、…

Spring Boot | Spring Boot “整合JPA“

目录 : 一、Spring Data JPA”介绍“二、Spring Data JPA”要进行的操作“ :① 编写ORM “实体类” ( 编写“数据库表”对应的“实体类” 配置“映射关系”的“注解”)② 编写 Repository 接口 ( 继承“JpaRepository接口” 其中的“操作数据库”的方法 通过“注…

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后,把下面的任务栏删除,把上面的任务栏移到下面,然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…