@deveco-test/deveco-code 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/package.json +6 -5
- package/resources/deveco/skills/customize-deveco/.deveco-builtin +1 -0
- package/resources/deveco/skills/customize-deveco/SKILL.md +469 -0
- package/resources/deveco/skills/deveco-cli/.deveco-builtin +1 -0
- package/resources/deveco/skills/deveco-cli/SKILL.md +240 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/.deveco-builtin +1 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/SKILL.md +83 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/01-layout.md +629 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/02-basic-components.md +645 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/03-data-display.md +81 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/04-selectors.md +76 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/05-media.md +60 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/06-advanced.md +32 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/07-security.md +30 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/08-state-decorators.md +79 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/09-animation.md +111 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/10-gesture.md +59 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/11-dialog-menu.md +92 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/12-navigation.md +81 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/13-rendering.md +22 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/14-extension.md +22 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/15-theme-style.md +10 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/16-enums.md +87 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/17-resources.md +1379 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/18-error-code.md +24 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-apis/_index.md +75 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/00-arkts-syntax.md +229 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/01-import.md +116 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/02-uicontext.md +56 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/03-component.md +105 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/04-build.md +41 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/05-state.md +300 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/06-rendering.md +67 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/07-attribute-params.md +219 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/08-navigation.md +102 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/09-dialog.md +72 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/10-style.md +90 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/11-extension.md +54 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/12-layout.md +69 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/13-performance.md +27 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/14-deprecated.md +28 -0
- package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/_index.md +79 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/.deveco-builtin +1 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/SKILL.md +187 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/SKILL_CN.md +160 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/evals/evals.json +17 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/businesserror_patterns.md +17 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/error_patterns.md +31 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/fault-mode-library.md +57 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/outofmemoryerror_patterns.md +19 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/rangeerror_patterns.md +15 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/referenceerror_patterns.md +23 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/syntaxerror_patterns.md +14 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/typeerror_patterns.md +19 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/reference/urierror_patterns.md +17 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/scripts/collect-hilog.mjs +120 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/scripts/jscrash-report.mjs +138 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/scripts/parse-jscrash-log.mjs +126 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/scripts/shared/deveco-cli.mjs +79 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/scripts/shared/jscrash-parse.mjs +389 -0
- package/resources/deveco/skills/hmos-runtime-fix-skill/scripts/shared/utils.mjs +27 -0
package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/08-navigation.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# 11. 导航与路由约束
|
|
2
|
+
|
|
3
|
+
## 规则
|
|
4
|
+
|
|
5
|
+
| 规则 | 说明 | 错误码 |
|
|
6
|
+
|------|------|--------|
|
|
7
|
+
| 推荐使用 Navigation + NavDestination | 替代 @ohos.router 和 pageTransition | — |
|
|
8
|
+
| Router 页面栈上限 32 | 超过 32 页报错 | **100003** |
|
|
9
|
+
| Navigation 默认转场时长不可控 | 弹簧曲线,时长因设备而异。**不要将业务逻辑耦合到默认转场时长** | — |
|
|
10
|
+
| 共享元素转场需禁用默认转场 | geometryTransition 时**必须禁用**系统默认转场动画 | — |
|
|
11
|
+
| customNavContentTransition 优先级更高 | 同时设置 Navigation 级和 NavDestination 级转场时,Navigation 级优先 | — |
|
|
12
|
+
| 未注册 builder 函数 | Navigation 跳转未注册 builder 的页面 | **100005** |
|
|
13
|
+
| 无 NavDestination 组件 | Navigation 跳转未包含 NavDestination 的页面 | **100006** |
|
|
14
|
+
| pushPath/pushDestination param 禁内联字面量 | `param: { id: 1 }` 是无类型字面量 → **10605038** | **10605038** |
|
|
15
|
+
| NavDestination 无 titleMode | titleMode 是 Navigation 专属属性,NavDestination 只有 `.title()` | **10505001** |
|
|
16
|
+
| 路由栈读取 | 目标页 `NavDestination().onReady((ctx: NavDestinationContext) => { this.navPathStack = ctx.pathStack })` 取栈,`ctx.pathInfo.param` 取参;不推荐 `@Provide`/`@Consume` 传 NavPathStack | — |
|
|
17
|
+
| 目标页根节点为 NavDestination | 目标页 `build()` 首节点必须是 `NavDestination`,否则白屏/挂载失败 | **100006** |
|
|
18
|
+
| 单 navDestination builder | 链式多次 `.navDestination()` 后者覆盖前者,所有路由落到最后一个页面(编译期不报错,运行时白屏) | — |
|
|
19
|
+
| hideNavBar 语义陷阱 | `.hideNavBar(true)` 隐藏导航页(标题+内容+工具栏),栈空时首页显示空白,且失去自适应分栏能力;全屏需求用 NavDestination 的 `.fullScreenOverlay(true)`,只藏标题用 `.hideTitleBar(true)` | — |
|
|
20
|
+
| Dialog 类型 NavDestination 无默认转场 | API 13 前无默认转场动画 | — |
|
|
21
|
+
|
|
22
|
+
### 参数传递
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
// ❌ WRONG -- param 内联字面量
|
|
26
|
+
this.stack.pushPath({ name: 'first', param: { id: 1 } }) // 10605038
|
|
27
|
+
|
|
28
|
+
// ✅ RIGHT -- param 先声明类型再传变量
|
|
29
|
+
interface PageParam { id: number }
|
|
30
|
+
const p: PageParam = { id: 1 }
|
|
31
|
+
this.stack.pushPath({ name: 'first', param: p })
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 转场动画约束
|
|
35
|
+
|
|
36
|
+
| 规则 | 说明 |
|
|
37
|
+
|------|------|
|
|
38
|
+
| 默认转场时长不可控 | 弹簧曲线,因设备而异,不要把业务逻辑耦合到默认转场时长 |
|
|
39
|
+
| geometryTransition 须禁用默认转场 | 否则叠加产生视觉异常 |
|
|
40
|
+
| 同时设置 Navigation 级和 NavDestination 级转场 | Navigation 级(customNavContentTransition)优先 |
|
|
41
|
+
| pageTransition 已废弃 | 用 Navigation 转场和 Modal 转场 |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 多文件 Navigation 路由架构
|
|
46
|
+
|
|
47
|
+
**不要把所有页面放在一个文件**。`@ComponentV2 export struct` 支持跨文件导出。
|
|
48
|
+
|
|
49
|
+
### 方案一(推荐):系统路由表 router_map.json
|
|
50
|
+
|
|
51
|
+
无需 import 页面、按需加载、天然跨模块,多页面一律用此方案。
|
|
52
|
+
|
|
53
|
+
- 配置 `resources/base/profile/router_map.json`(`routerMap` 数组:`name` + `buildMethod` + `pageSourceFile`)
|
|
54
|
+
- `module.json5` 添加 `"routerMap": "$profile:router_map"`
|
|
55
|
+
- 页面文件导出 `@Builder export function XxxBuilder(): void { XxxPage() }`
|
|
56
|
+
- 主文件用 `pushDestination({ name: 'PageName', param })` 跳转:Promise 返回、错误码经 reject 传递(`pushPath`/`pushPathByName` 无错误码返回,不推荐)
|
|
57
|
+
- 目标页在 `NavDestination().onReady((ctx: NavDestinationContext) => { this.navPathStack = ctx.pathStack })` 取栈,`ctx.pathInfo.param` 取参(见上方规则表)
|
|
58
|
+
|
|
59
|
+
### 方案二(备选):自定义路由表 .navDestination(builder)
|
|
60
|
+
|
|
61
|
+
仅限单层简单场景。必须用**单个** builder 内 `if/else` 做 name→page 映射;**链式多次 `.navDestination()` 后者覆盖前者**,所有路由会落到最后一个页面(编译期不报错,运行时白屏)。
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
// PageA.ets
|
|
65
|
+
@ComponentV2 export struct PageA {
|
|
66
|
+
@Param navPathStack: NavPathStack = new NavPathStack()
|
|
67
|
+
@Param goodsIdValue: string = ''
|
|
68
|
+
build() { NavDestination() { /* ... */ } }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// MainHost.ets
|
|
72
|
+
import { PageA } from './PageA'
|
|
73
|
+
@Entry @ComponentV2 struct MainHost {
|
|
74
|
+
@Local navPathStackValue: NavPathStack = new NavPathStack()
|
|
75
|
+
@Builder pageMap(name: string, param: Object) {
|
|
76
|
+
if (name === 'PageA') { PageA({ navPathStack: this.navPathStackValue, goodsIdValue: '123' }) }
|
|
77
|
+
}
|
|
78
|
+
build() {
|
|
79
|
+
Navigation(this.navPathStackValue) { /* 首页 */ }.navDestination(this.pageMap)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
> 页面获取栈:`onReady` 从 NavDestinationContext 取(推荐,可同时取 `pathInfo.param`);`queryNavigationInfo()`(12+,推荐)任意自定义组件任意时机可取、不依赖生命周期。不推荐 `@Provide`/`@Consume` 或 AppStorage 传栈。
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 常见错误对比
|
|
89
|
+
|
|
90
|
+
| ❌ 错误写法 | ✅ 正确写法 | 说明 |
|
|
91
|
+
|------------|-----------|------|
|
|
92
|
+
| 使用 `@ohos.router` 做页面跳转 | Navigation + NavDestination | Router 不推荐 |
|
|
93
|
+
| 多个页面各自 `@Entry` | 单 Page 应用只有一个 @Entry | 多页面通过 Navigation 管理 |
|
|
94
|
+
| Navigation 跳转未注册 builder | 必须在 Navigation 中注册 destination builder | 100005 |
|
|
95
|
+
| 使用 `pageTransition` 做页面转场 | Navigation 转场或 Modal 转场 | pageTransition 已废弃 |
|
|
96
|
+
| pushPath 的 param 内联字面量 | 先声明 interface 再用 interface 类型变量传递 | 10605038 |
|
|
97
|
+
| NavDestination 调用 titleMode | NavDestination 只用 `.title()`,`.titleMode()` 只挂 Navigation | 10505001 |
|
|
98
|
+
|
|
99
|
+
## 参考
|
|
100
|
+
|
|
101
|
+
- 废弃接口替换见 [19-deprecated](14-deprecated.md)
|
|
102
|
+
- 对话框与半模态见 [12-dialog](09-dialog.md)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# 12. 对话框与半模态约束
|
|
2
|
+
|
|
3
|
+
## 规则
|
|
4
|
+
|
|
5
|
+
| 规则 | 说明 | 错误码 |
|
|
6
|
+
|------|------|--------|
|
|
7
|
+
| 多弹窗堆叠 | 多个弹窗按**后弹优先**原则堆叠,退出时从高到低 | — |
|
|
8
|
+
| 系统弹窗阻塞自定义弹窗 | 系统弹窗显示时,非系统弹窗显示接口被阻塞 | — |
|
|
9
|
+
| 不建议后台弹窗 | 应用不在前台时不建议调用弹窗显示接口 | — |
|
|
10
|
+
| bindSheet onWillDismiss | 声明后所有关闭操作必须通过 `dismiss()` 调用处理,否则无法关闭 | — |
|
|
11
|
+
| bindSheet UIExtension 限制 | Sheet 内嵌入 UIExtension 时,不支持在 UIExtension 内再启动额外的 sheet/dialog | — |
|
|
12
|
+
| bindSheet 悬停避让限制 | 悬停/中轴避让不支持子窗口模式(showInSubWindow 为 true 时) | — |
|
|
13
|
+
| CustomDialogController 不推荐 | API 12 起不推荐,用 `promptAction.openCustomDialog` | — |
|
|
14
|
+
| **AlertDialog 调用方式** | 通过 `this.getUIContext().showAlertDialog()` 或全局 `AlertDialog.show()`(全局可用,建议走 UIContext) | — |
|
|
15
|
+
|
|
16
|
+
### AlertDialog 按钮字段
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
// ❌ WRONG -- 用 text 字段 → 10505001
|
|
20
|
+
this.getUIContext().showAlertDialog({
|
|
21
|
+
message: '确认?',
|
|
22
|
+
buttons: [{ text: '取消', action: () => {} }]
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
// ✅ RIGHT -- 用 value + action
|
|
26
|
+
this.getUIContext().showAlertDialog({
|
|
27
|
+
message: '确认?',
|
|
28
|
+
buttons: [{ value: '取消', action: () => {} }, { value: '确认', action: () => {} }]
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`AlertDialog` 最多 `primaryButton` + `secondaryButton` 两个按钮字段,**无 `tertiaryButton`**;要更多按钮用 `buttons` 数组。
|
|
33
|
+
|
|
34
|
+
### bindSheet
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
// ✅ RIGHT
|
|
38
|
+
.bindSheet($$this.isShow, this.sheetBuilder, {
|
|
39
|
+
height: SheetSize.MEDIUM, // SheetSize 只有 MEDIUM/LARGE,没有 HALF
|
|
40
|
+
dragBar: true,
|
|
41
|
+
showClose: true
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`SheetSize` 只有 `MEDIUM`/`LARGE`,**没有 `HALF`**(`10505001`)。`$$` 双向绑定必填,否则 sheet 关不掉。用 `detents`/`height`,**没有 `sheetSize` 字段**。
|
|
46
|
+
|
|
47
|
+
### ActionSheet 用 `sheets`,不是 `buttons`
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
// ❌ WRONG
|
|
51
|
+
ActionSheet.show({ buttons: [{ title: 'x', action: () => {} }] })
|
|
52
|
+
// ✅ RIGHT
|
|
53
|
+
this.getUIContext().showActionSheet({ sheets: [{ title: 'x', action: () => {} }] })
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### bindContextMenu 第二参数用枚举
|
|
57
|
+
|
|
58
|
+
`.bindContextMenu(this.menu, ResponseType.LongPress)`,不要传字符串 `'longpress'`。
|
|
59
|
+
|
|
60
|
+
## 常见错误对比
|
|
61
|
+
|
|
62
|
+
| ❌ 错误写法 | ✅ 正确写法 | 说明 |
|
|
63
|
+
|------------|-----------|------|
|
|
64
|
+
| `buttons: [{ text: '取消' }]` | `buttons: [{ value: '取消', action: () => {} }]` | AlertDialog 按钮用 value 非 text |
|
|
65
|
+
| `height: SheetSize.HALF` | `height: SheetSize.MEDIUM` | SheetSize 无 HALF,只有 MEDIUM/LARGE |
|
|
66
|
+
| `ActionSheet.show({ buttons: [...] })` | `showActionSheet({ sheets: [...] })` | ActionSheet 用 sheets |
|
|
67
|
+
| `CustomDialogController` | `promptAction.openCustomDialog` | 已废弃 |
|
|
68
|
+
|
|
69
|
+
## 参考
|
|
70
|
+
|
|
71
|
+
- 废弃接口替换见 [19-deprecated](14-deprecated.md)
|
|
72
|
+
- 导航与路由见 [11-navigation](08-navigation.md)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 13. 样式与主题约束
|
|
2
|
+
|
|
3
|
+
## 规则
|
|
4
|
+
|
|
5
|
+
### @Extend
|
|
6
|
+
|
|
7
|
+
| 规则 | 说明 | 错误码 |
|
|
8
|
+
|------|------|--------|
|
|
9
|
+
| 仅支持全局定义 | 不能在组件内部定义 | — |
|
|
10
|
+
| 仅当前文件可用 | 不支持 export(需 export 用 AttributeModifier) | — |
|
|
11
|
+
| **不能与 @Styles 混用** | | — |
|
|
12
|
+
| **必须省略返回类型** | 不写 `: void`,否则破坏链式调用 | — |
|
|
13
|
+
| **禁止嵌套函数定义** | 逻辑抽到顶层方法,否则连锁语法崩溃 | arkts-no-nested-funcs |
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// ❌ WRONG -- 标了 :void,链式调用炸
|
|
17
|
+
@Extend(Text) function card(): void { .padding(8) }
|
|
18
|
+
// -> .card().width() 报 Property 'width' does not exist on type 'void'
|
|
19
|
+
|
|
20
|
+
// ❌ WRONG -- 内嵌套函数
|
|
21
|
+
@Extend(Text) function card() { function inner() {} .padding(8) }
|
|
22
|
+
// -> 连锁引发 ';' expected / Only UI component syntax can be written here
|
|
23
|
+
|
|
24
|
+
// ✅ RIGHT -- 省略返回类型,逻辑抽顶层
|
|
25
|
+
@Extend(Text) function card() { .padding(8) .backgroundColor(Color.White) }
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### @Styles
|
|
29
|
+
|
|
30
|
+
| 规则 | 说明 |
|
|
31
|
+
|------|------|
|
|
32
|
+
| 不支持参数 | |
|
|
33
|
+
| 不支持业务逻辑语句 | |
|
|
34
|
+
| 仅支持通用属性 | 不支持组件私有属性(如 Button 的 fontColor) |
|
|
35
|
+
| 不支持 export | |
|
|
36
|
+
|
|
37
|
+
### stateStyles
|
|
38
|
+
|
|
39
|
+
| 规则 | 说明 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| 仅支持通用属性 | 组件私有属性不生效 |
|
|
42
|
+
| 聚焦状态仅通过外接键盘 Tab/方向键触发 | 不支持嵌套滚动组件内按键触发 |
|
|
43
|
+
|
|
44
|
+
### 实时模糊性能
|
|
45
|
+
|
|
46
|
+
| 接口 | 说明 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| backdropBlur / blur / backgroundBlurStyle / foregroundBlurStyle / motionBlur | **每帧实时渲染,性能开销大** |
|
|
49
|
+
| 静态模糊场景 | 用 effectKit 的静态模糊接口 |
|
|
50
|
+
|
|
51
|
+
### clipShape
|
|
52
|
+
|
|
53
|
+
- clipShape 使用时,shape 的 **fill 属性不生效**
|
|
54
|
+
|
|
55
|
+
### 深色/浅色模式
|
|
56
|
+
|
|
57
|
+
| 规则 | 说明 |
|
|
58
|
+
|------|------|
|
|
59
|
+
| 通过函数返回值动态读取 colorMode 不可靠 | 热更新时属性设置代码可能不重新执行 |
|
|
60
|
+
| BuilderNode / ComponentContent 需手动传播系统环境变更 | 调用 `updateConfiguration()` |
|
|
61
|
+
|
|
62
|
+
### 动画约束
|
|
63
|
+
|
|
64
|
+
| 规则 | 说明 |
|
|
65
|
+
|------|------|
|
|
66
|
+
| 位置/尺寸动画性能差 | 推荐用 scale 替代 |
|
|
67
|
+
| onFinish 回调慎用 | 关闭开发者转场动画或 UIAbility 后台时,finish 回调立即触发 |
|
|
68
|
+
| animateToImmediately 慎用 | 绕过 vsync,正常用 animateTo |
|
|
69
|
+
| keyframeAnimateTo 不支持弹簧曲线 | 不支持 springMotion/responsiveSpringMotion/interpolatingSpring |
|
|
70
|
+
| springMotion/interpolatingSpring 自动计算时长 | 开发者指定的 duration 被忽略 |
|
|
71
|
+
| springCurve 不推荐 | 扭曲物理时间 |
|
|
72
|
+
| TransitionEffect.animation 的 onFinish 不生效 | |
|
|
73
|
+
| 父组件必须有 transition | 否则子组件消失转场不触发 |
|
|
74
|
+
| pageTransition 已废弃 | 用 Navigation 转场 / Modal 转场 |
|
|
75
|
+
| @AnimatableExtend 参数限制 | 只允许 number/string/Color 及其联合类型;卡片动画最大 1000ms |
|
|
76
|
+
| AnimatorResult 需及时销毁 | 否则内存泄漏 |
|
|
77
|
+
|
|
78
|
+
## 常见错误对比
|
|
79
|
+
|
|
80
|
+
| ❌ 错误写法 | ✅ 正确写法 | 说明 |
|
|
81
|
+
|------------|-----------|------|
|
|
82
|
+
| `@Extend(Text) function card(): void { ... }` | 省略 `: void` | 破坏链式调用 |
|
|
83
|
+
| `@Extend` 内写 `function inner() {}` | 逻辑抽到顶层方法 | arkts-no-nested-funcs |
|
|
84
|
+
| `@Styles` 里写组件私有属性 | 仅通用属性 | 不生效 |
|
|
85
|
+
| `@Extend` 与 `@Styles` 混用 | 分开使用 | 不能混用 |
|
|
86
|
+
|
|
87
|
+
## 参考
|
|
88
|
+
|
|
89
|
+
- @Extend/@Styles 在状态管理中的位置见 [05-state-v1](05-state.md)
|
|
90
|
+
- 废弃接口 pageTransition 见 [19-deprecated](14-deprecated.md)
|
package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/11-extension.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 11. 扩展能力与交互
|
|
2
|
+
|
|
3
|
+
## 扩展能力
|
|
4
|
+
|
|
5
|
+
### DrawModifier
|
|
6
|
+
- **一个实例只能设置给一个组件**,禁止多个组件复用同一个 DrawModifier
|
|
7
|
+
- **不支持**在 attributeModifier 内调用 drawModifier
|
|
8
|
+
|
|
9
|
+
### GestureModifier
|
|
10
|
+
- **不支持**自定义组件
|
|
11
|
+
- **不支持**在 attributeModifier 内调用 gestureModifier
|
|
12
|
+
|
|
13
|
+
### AttributeUpdater
|
|
14
|
+
- **一个对象只能关联一个组件**,用于多个组件时只有一个生效
|
|
15
|
+
- 与状态变量同时更新同一属性时会**互相覆盖**
|
|
16
|
+
|
|
17
|
+
### NodeContainer
|
|
18
|
+
- **仅支持**自定义 FrameNode 节点和 BuilderNode 根节点作为子节点
|
|
19
|
+
- 系统组件代理节点**不能**成功挂载
|
|
20
|
+
|
|
21
|
+
### 节点单父规则
|
|
22
|
+
- 一个节点**只能有一个父节点**。挂载到多个 NodeContainer 会导致异常
|
|
23
|
+
- 迁移节点时**必须先从旧父节点移除**,再添加到新父节点
|
|
24
|
+
|
|
25
|
+
### FrameNode
|
|
26
|
+
- 声明式(系统)FrameNode **不可修改**:不能设置属性、增删子节点、绑定控制器(错误码 100021)
|
|
27
|
+
- 未挂载的节点**不能进行节点操作**(错误码 106203)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 交互与手势
|
|
32
|
+
|
|
33
|
+
| 规则 | 说明 |
|
|
34
|
+
|------|------|
|
|
35
|
+
| 长按与拖拽冲突 | 长按手势与拖拽手势同时绑定时可能冲突,需注意优先级 |
|
|
36
|
+
| onDragLeave 限制 | onDragLeave 在某些场景下不触发,不要将核心逻辑挂在其上 |
|
|
37
|
+
| 匿名函数 this 问题 | ArkTS 中**不允许使用匿名函数**绑定事件,必须使用箭头函数 |
|
|
38
|
+
| bind(this) 不推荐 | 成员函数配合 bind(this) 配置事件方法不推荐 |
|
|
39
|
+
| TouchEvent 类型 | 触摸事件参数是 `TouchEvent`/`TouchObject`,**不存在 `TouchInfo`** |
|
|
40
|
+
|
|
41
|
+
### 事件绑定
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
// ❌ WRONG
|
|
45
|
+
.onClick(function() { this.do() })
|
|
46
|
+
.onClick(this.handler.bind(this))
|
|
47
|
+
|
|
48
|
+
// ✅ RIGHT
|
|
49
|
+
.onClick(() => { this.handler() })
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 参考
|
|
53
|
+
|
|
54
|
+
- 错误码:**100021**(声明式 FrameNode 不可修改)、**106203**(未挂载节点操作)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 16. 布局容器约束
|
|
2
|
+
|
|
3
|
+
## 规则
|
|
4
|
+
|
|
5
|
+
### 容器直接子组件约束
|
|
6
|
+
|
|
7
|
+
| 容器 | 只接受直接子组件 |
|
|
8
|
+
|------|----------------|
|
|
9
|
+
| `List` | `ListItem`(或 `ListItemGroup`) |
|
|
10
|
+
| `Grid` | `GridItem` |
|
|
11
|
+
| `Tabs` | `TabContent` |
|
|
12
|
+
| `WaterFlow` | `FlowItem` |
|
|
13
|
+
| `Shape` | `Rect`/`Path`/`Circle`/`Ellipse`/`Shape`/`Polyline`/`Polygon`/`Image`/`Text`/`Column`/`Row` |
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// ❌ WRONG
|
|
17
|
+
List() { Text('item') }
|
|
18
|
+
Grid() { Text('cell') }
|
|
19
|
+
Tabs() { Text('tab') }
|
|
20
|
+
|
|
21
|
+
// ✅ RIGHT
|
|
22
|
+
List() { ListItem() { Text('item') } }
|
|
23
|
+
Grid() { GridItem() { Text('cell') } }
|
|
24
|
+
Tabs() { TabContent() { Text('tab') } }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`if/else` 是"透明"的:即使条件分支,`Grid` 内仍只能出现 `GridItem`。
|
|
28
|
+
|
|
29
|
+
### List / Grid / WaterFlow / Swiper
|
|
30
|
+
|
|
31
|
+
| 规则 | 说明 |
|
|
32
|
+
|------|------|
|
|
33
|
+
| 使用 LazyForEach 时子组件尺寸不能缺失 | 否则懒加载失效 |
|
|
34
|
+
| 同一容器内不建议同时使用 ForEach 和 LazyForEach | |
|
|
35
|
+
| 设置 cachedCount 可优化懒加载性能 | |
|
|
36
|
+
|
|
37
|
+
### Flex
|
|
38
|
+
|
|
39
|
+
| 规则 | 说明 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| 注意 flexWrap 默认值和主轴方向的对齐方式 | |
|
|
42
|
+
| 嵌套过深可能导致性能问题 | |
|
|
43
|
+
|
|
44
|
+
### RelativeContainer
|
|
45
|
+
|
|
46
|
+
| 规则 | 说明 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| 锚点规则需正确设置 | |
|
|
49
|
+
| center/middle 等对齐规则需指定 anchor 和 align | |
|
|
50
|
+
|
|
51
|
+
### Scroll
|
|
52
|
+
|
|
53
|
+
| 规则 | 说明 |
|
|
54
|
+
|------|------|
|
|
55
|
+
| 嵌套滚动场景注意滚动冲突 | |
|
|
56
|
+
| Scroll 内不支持 LazyForEach | 仅 List/Grid/WaterFlow/Swiper 支持懒加载 |
|
|
57
|
+
|
|
58
|
+
## 常见错误对比
|
|
59
|
+
|
|
60
|
+
| ❌ 错误写法 | ✅ 正确写法 | 说明 |
|
|
61
|
+
|------------|-----------|------|
|
|
62
|
+
| `List()` 内直接放非 `ListItem` | `List() { ListItem() { Text('...') } }` | List 仅接受 ListItem 作为直接子组件 |
|
|
63
|
+
| `Tabs()` 内直接放非 `TabContent` | `Tabs() { TabContent() { Text('...') } }` | Tabs 仅接受 TabContent |
|
|
64
|
+
| `Grid()` 内直接放非 `GridItem` | `Grid() { GridItem() { Text('...') } }` | Grid 仅接受 GridItem |
|
|
65
|
+
| `WaterFlow()` 内直接放非 `FlowItem` | `WaterFlow() { FlowItem() { Text('...') } }` | WaterFlow 仅接受 FlowItem |
|
|
66
|
+
|
|
67
|
+
## 参考
|
|
68
|
+
|
|
69
|
+
- 渲染控制(LazyForEach/Repeat)见 [08-rendering](06-rendering.md)
|
package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/13-performance.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 13. 性能与可见性
|
|
2
|
+
|
|
3
|
+
## 性能
|
|
4
|
+
|
|
5
|
+
| 规则 | 说明 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| **禁止在 build() 的 UI 描述中改变状态** | 会导致无限重渲染循环或性能下降 |
|
|
8
|
+
| 网络图片 syncLoad | 大量网络图片场景,注意 syncLoad 设置,避免同步加载导致卡顿 |
|
|
9
|
+
| 注销回调 | 组件销毁时必须**及时注销**事件回调,避免内存泄漏 |
|
|
10
|
+
| AnimatorResult 销毁 | 不及时销毁会导致内存泄漏 |
|
|
11
|
+
| 长列表优先用 Repeat/LazyForEach | ForEach 在大数据量场景性能差 |
|
|
12
|
+
| 组件复用 | 使用 @Reusable/@ReusableV2 配合 LazyForEach 实现节点复用 |
|
|
13
|
+
| @Track 精准更新 | 使用 @Track 装饰器可减少不必要的组件重渲染 |
|
|
14
|
+
| 组件冻结 | 使用 freeze/freezeV2 实现非活跃组件冻结,减少不必要的更新 |
|
|
15
|
+
|
|
16
|
+
## 可见性
|
|
17
|
+
|
|
18
|
+
| 规则 | 说明 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| onVisibleAreaChange | 可见区域**受父组件边界限制**,超出父组件的区域不计入。每帧计算,**尽量减少使用** |
|
|
21
|
+
| nodeRenderState | **不推荐**用于列表项(因节点回收),更适合页面级或 Tab 级可见性监控 |
|
|
22
|
+
| 渲染状态 ≠ 可见性 | ABOUT_TO_RENDER_IN 表示进入渲染管线,但可能被其他组件遮挡。渲染状态不完全等于视觉可见性 |
|
|
23
|
+
|
|
24
|
+
## 参考
|
|
25
|
+
|
|
26
|
+
- build() 约束见 [04-build](04-build.md)
|
|
27
|
+
- 渲染控制(ForEach/LazyForEach/Repeat)见 [06-rendering](06-rendering.md)
|
package/resources/deveco/skills/hmos-arkui-develop-skill/references/quick-rules/14-deprecated.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# 19. 废弃接口替换
|
|
2
|
+
|
|
3
|
+
## 规则
|
|
4
|
+
|
|
5
|
+
| 规则 | 说明 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| **禁止使用 CustomDialogController** | API 12 起不推荐,用 `promptAction.openCustomDialog` 替代 |
|
|
8
|
+
| **禁止使用 pageTransition** | 用 Navigation 转场或 Modal 转场替代 |
|
|
9
|
+
| **禁止使用 @ohos.* 路径导入** | 旧版导入路径已废弃,必须用 `@kit.*` 替代 |
|
|
10
|
+
| **禁止在 @Component 中使用 static {}** | V1 中静态代码块不执行(API 22 起告警) |
|
|
11
|
+
|
|
12
|
+
## 废弃对照表
|
|
13
|
+
|
|
14
|
+
| ❌ 废弃写法 | ✅ 正确替代 |
|
|
15
|
+
|------------|-----------|
|
|
16
|
+
| `CustomDialogController` | `promptAction.openCustomDialog` |
|
|
17
|
+
| `pageTransition()` | Navigation 转场 / Modal 转场 |
|
|
18
|
+
| `@ohos.router` 做导航 | Navigation + NavDestination |
|
|
19
|
+
| 全局 `animateTo`/`vp2px` 等(API 18+) | `this.getUIContext().animateTo()` 等 |
|
|
20
|
+
| `@Component` + `static {}` | 使用 @ComponentV2 或移除静态代码块 |
|
|
21
|
+
| `@ohos.*` 导入 | `@kit.*` 导入 |
|
|
22
|
+
| `SwiperDisplayMode.AutoLinear` | `SwiperDisplayMode.Auto`(AutoLinear 已废弃) |
|
|
23
|
+
|
|
24
|
+
## 参考
|
|
25
|
+
|
|
26
|
+
- 导入规则见 [01-import](01-import.md)
|
|
27
|
+
- UIContext 替换见 [02-uicontext](02-uicontext.md)
|
|
28
|
+
- 导航与路由见 [11-navigation](08-navigation.md)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# ArkUI 编码规范统一索引
|
|
2
|
+
|
|
3
|
+
> **定位**:编码规范、错误预防、编译错误码三位一体。每个文件包含"规则(正面规范)→ 常见错误(错误对照)→ 参考(错误码/版本)"三层。
|
|
4
|
+
>
|
|
5
|
+
> **使用时机**:
|
|
6
|
+
> 1. **编码前**:扫 00-arkts-syntax(ArkTS 语法规则)和 01-import / 02-uicontext(最高频错误)
|
|
7
|
+
> 2. **编码中**:写属性参数对照 07-attribute-params;状态管理看 05-state;列表渲染看 06-rendering;视图架构看 08-navigation/12-layout;@Builder 看 05-state;@Observed 看 05-state
|
|
8
|
+
> 3. **多页面/多文件生成时**:必扫 03-component(跨文件接口重名——单类实测毁掉 11/44 失败用例)
|
|
9
|
+
> 4. **检视时**:逐条对照下方检视清单
|
|
10
|
+
|
|
11
|
+
## 文件索引
|
|
12
|
+
|
|
13
|
+
| 文件 | 主题 | 覆盖范围 |
|
|
14
|
+
|------|------|---------|
|
|
15
|
+
| [00-arkts-syntax](00-arkts-syntax.md) | ArkTS 语法规则 | 83 条 `arkts-*` 规则索引、TS→ArkTS 改写表、空安全、export/import、类型注解 |
|
|
16
|
+
| [01-import](01-import.md) | 模块导入 | import 规则、kit 速查表、全局内置、常见错误对照 |
|
|
17
|
+
| [02-uicontext](02-uicontext.md) | UIContext 全局接口 | 全局接口 → UIContext 替换表、常见错误 |
|
|
18
|
+
| [03-component](03-component.md) | 自定义组件与命名 | 组件基本约束、保留字全表、框架方法名冲突(10505001)、跨文件重名(arkts-no-decl-merging) |
|
|
19
|
+
| [04-build](04-build.md) | build() 函数约束 | 根节点约束、禁止项(变量/console/switch/三元)、sort/filter 陷阱 |
|
|
20
|
+
| [05-state](05-state.md) | 状态管理(V1+V2+混用) | @State/@Prop/@Link/@ObjectLink/@Observed/@Provide/@Consume/@Watch、@Builder、@Observed 不刷新排查、@Local/@Param/@Once/@Event/@Monitor/@Computed/@ObservedV2/@Trace、V1/V2 混用桥接 |
|
|
21
|
+
| [06-rendering](06-rendering.md) | 渲染控制 | ForEach/LazyForEach/Repeat、if/else、key 生成器、DataChangeListener |
|
|
22
|
+
| [07-attribute-params](07-attribute-params.md) | 属性与 API 参数 | 属性命名、枚举值、参数格式、构造器参数、回调参数类型、空安全、臆造 API 清单、不存在的 API |
|
|
23
|
+
| [08-navigation](08-navigation.md) | 导航与路由 | Navigation+NavDestination、多文件路由方案、pushPath param、转场约束 |
|
|
24
|
+
| [09-dialog](09-dialog.md) | 对话框与半模态 | AlertDialog/ActionSheet/bindSheet/bindContextMenu、堆叠规则 |
|
|
25
|
+
| [10-style](10-style.md) | 样式与主题 | @Extend/@Styles/stateStyles、模糊效果、clipShape、深色模式、@Extend 返回类型陷阱 |
|
|
26
|
+
| [11-extension](11-extension.md) | 扩展能力与交互 | DrawModifier/GestureModifier/AttributeUpdater/NodeContainer/FrameNode、手势绑定、拖拽冲突、事件规则 |
|
|
27
|
+
| [12-layout](12-layout.md) | 布局容器 | List/Grid/Tabs/WaterFlow 直接子组件约束、容器用法 |
|
|
28
|
+
| [13-performance](13-performance.md) | 性能与可见性 | 状态变更、@Reusable/@Track、freeze、长列表策略、onVisibleAreaChange、渲染状态≠可见性 |
|
|
29
|
+
| [14-deprecated](14-deprecated.md) | 废弃接口替换 | CustomDialogController/pageTransition/@ohos.*/static {} 替换 |
|
|
30
|
+
|
|
31
|
+
## 编码检视清单
|
|
32
|
+
|
|
33
|
+
### import 和模块
|
|
34
|
+
- [ ] 所有 import 使用 `@kit.*` 路径(见 01-import)
|
|
35
|
+
- [ ] import 的符号名和所属 kit 正确(见 01-import Kit导入速查表)
|
|
36
|
+
- [ ] 不存在 import 了但未使用的模块
|
|
37
|
+
- [ ] 不存在遗漏的 import
|
|
38
|
+
|
|
39
|
+
### UIContext 和全局接口
|
|
40
|
+
- [ ] router、promptAction、AlertDialog、animateTo、vp2px 等全局接口均通过 `this.getUIContext()` 调用(见 02-uicontext)
|
|
41
|
+
|
|
42
|
+
### 状态管理
|
|
43
|
+
- [ ] 所有状态变量声明了类型(见 00-arkts-syntax Types 节)
|
|
44
|
+
- [ ] 每个装饰器用在正确的位置(见 05-state)
|
|
45
|
+
- [ ] 避免 V1 与 V2 混用(见 05-state 混用节)
|
|
46
|
+
- [ ] @Link / @ObjectLink 不存在本地初始化(见 05-state)
|
|
47
|
+
- [ ] @Builder 按引用传递用单参数对象字面量;@Builder 内不修改入参(见 05-state)
|
|
48
|
+
|
|
49
|
+
### 渲染控制
|
|
50
|
+
- [ ] ForEach / LazyForEach 有第三个参数作为 key,且用业务 ID 不用索引(见 06-rendering)
|
|
51
|
+
- [ ] dataSource 不重新赋值,通过 DataChangeListener 更新(见 06-rendering)
|
|
52
|
+
|
|
53
|
+
### build() 函数
|
|
54
|
+
- [ ] build() 中不存在本地变量声明、console.info、switch、三元表达式(见 04-build)
|
|
55
|
+
- [ ] build() 中不直接改变状态变量(见 04-build)
|
|
56
|
+
|
|
57
|
+
### 命名和嵌套
|
|
58
|
+
- [ ] 变量名避开框架保留字(见 03-component 保留字全表)
|
|
59
|
+
- [ ] 组件和变量命名避开框架内置组件和属性名(见 03-component)
|
|
60
|
+
- [ ] 组件嵌套符合约束(List 内必须用 ListItem,Tabs 内必须用 TabContent)(见 12-layout)
|
|
61
|
+
- [ ] **多页面生成时,所有顶层 interface/class 名必须带用例 ID 或页面名前缀**(防 arkts-no-decl-merging,见 03-component)
|
|
62
|
+
|
|
63
|
+
### 属性参数
|
|
64
|
+
- [ ] 不捏造属性名/枚举值(见 07-attribute-params 臆造API清单)
|
|
65
|
+
- [ ] 回调参数类型用编译器声明的联合类型,不自行收窄(见 07-attribute-params)
|
|
66
|
+
- [ ] 从回调 result/Map.get/Array.find/可选属性取值时做了空安全处理(?? 默认值或判空)(见 07-attribute-params / 00-arkts-syntax)
|
|
67
|
+
- [ ] 传给组件构造/API 的对象字面量,字段名与 Options 类型逐字一致(见 07-attribute-params)
|
|
68
|
+
|
|
69
|
+
### 导航
|
|
70
|
+
- [ ] 路由跳转使用 Navigation 实现,不使用 Router(见 08-navigation)
|
|
71
|
+
- [ ] pushPath 的 param 先声明 interface 类型变量,不内联字面量(见 08-navigation)
|
|
72
|
+
|
|
73
|
+
### 废弃接口
|
|
74
|
+
- [ ] 不使用 CustomDialogController、pageTransition、@ohos.* 导入(见 14-deprecated)
|
|
75
|
+
|
|
76
|
+
### 代码风格
|
|
77
|
+
- [ ] 组件/变量命名遵循 PascalCase/camelCase
|
|
78
|
+
- [ ] 组件内部结构顺序:状态定义 → 属性 → 私有成员 → 生命周期 → 私有方法 → build()
|
|
79
|
+
- [ ] 链式调用每个方法一行;逻辑语句加分号,UI 语句不加分号
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
hmos-runtime-fix-skill
|