鸿蒙 6.1 API 23 开发坑系列篇 1:ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier<T> 状态化节点修改器根因
本文是「鸿蒙 6.1 API 23 开发坑系列」第 1 篇ArkUI 桶第 1 篇。鸿蒙 6.1 API 23 共 397 个 API namespace本系列按类别分桶写几百篇每篇一个具体 API namespace 真名坑。本篇讲ohos.arkui.modifiernamespaceAPI 12鸿蒙 6.1 API 23 基座——74 个 Modifier 装饰器类attributeModifierAttributeModifierT状态化节点修改器根因。鸿蒙坑根因applyNormalAttribute是方法声明不是属性——buttonModifier.applyNormalAttribute fn编译错arkts-no-method-reassignmentArkTS 禁止给对象方法重新赋值正确用法是class MyModifier implements AttributeModifierT { applyNormalAttribute(instance) {} }attributeModifier(myModifier)绑定。一、开篇鸿蒙 modifier 不是 React useReducer是「节点属性修改器」你写 React 时组件状态管理用useReducerreducer 函数 dispatch 派发动作// React useReducerreducer 函数 dispatch 派发动作状态管理 hook function Button() { const [state, dispatch] useReducer((state, action) { if (action.type toggle) { return { fontSize: 20, bgColor: #28a745, fontColor: #ffffff } } return { fontSize: 16, bgColor: #2563eb, fontColor: #ffffff } }, { fontSize: 16, bgColor: #2563eb, fontColor: #ffffff }) // ❌ React useReducerreducer 函数 dispatch 派发动作状态管理 hook不是节点修改器 return button style{{ fontSize: state.fontSize, backgroundColor: state.bgColor }} onClick{() dispatch({ type: toggle })}按钮/button }你写鸿蒙 ArkTS 时节点属性修改用AttributeModifierT装饰器class implements applyNormalAttribute 方法 attributeModifier 绑定// ArkTS AttributeModifierclass implements applyNormalAttribute 方法 attributeModifier 绑定 class MyButtonModifier implements AttributeModifierButtonAttribute { fontSize: number 16 bgColor: ResourceColor #2563eb fontColor: ResourceColor #ffffff // ✅ applyNormalAttribute 是方法声明class implements AttributeModifierT不是属性赋值 applyNormalAttribute(instance: ButtonAttribute): void { // ✅ instance 是 ButtonAttribute 实例改属性用同名 setter 方法 instance.fontSize(this.fontSize) instance.backgroundColor(this.bgColor) instance.fontColor(this.fontColor) } // ✅ applyPressedAttribute 按下态可选方法状态化节点修改器多状态 applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#dc3545) instance.fontSize(22) } } const myButtonModifier: MyButtonModifier new MyButtonModifier() Entry Component struct Index { build() { // ✅ attributeModifier 绑定装饰器实例到组件鸿蒙坑attributeModifier 绑定 AttributeModifierT 实例 Button(受 MyButtonModifier 装饰器控制的按钮) .attributeModifier(myButtonModifier) } }React useReducer vs 鸿蒙 AttributeModifier 的区别React 把状态管理当 reducer 函数useReducer dispatch 派发动作状态管理 hook声明式 UIArkTS 把节点属性修改当装饰器类class implements AttributeModifier applyNormalAttribute 方法改 instance 属性 attributeModifier 绑定节点属性修改器命令式 setter。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute 是方法声明改 instance 属性attributeModifier 绑定装饰器实例到组件。二、根因鸿蒙 AttributeModifier 的绑定机制鸿蒙ohos.arkui.modifiernamespaceAPI 12有74 个 Modifier 装饰器类每个继承对应 Attribute 类 实现AttributeModifierXxxAttributeinterface核心方法applyNormalAttribute(instance: XxxAttribute): void改属性。绑定机制来自四重根因。机制 174 个 Modifier 类——extends XxxAttribute implements AttributeModifier鸿蒙 74 个 Modifier 装饰器类每个 extends 对应 Attribute 类 implements AttributeModifier// ✅ ButtonModifier 类声明extends ButtonAttribute implements AttributeModifierButtonAttribute export declare class ButtonModifier extends ButtonAttribute implements AttributeModifierButtonAttribute { applyNormalAttribute?(instance: ButtonAttribute): void } // ✅ TextModifier 类声明extends TextAttribute implements AttributeModifierTextAttribute export declare class TextModifier extends TextAttribute implements AttributeModifierTextAttribute { applyNormalAttribute?(instance: TextAttribute): void } // ✅ 74 个 Modifier 类ButtonModifier/TextModifier/ImageModifier/ColumnModifier/RowModifier/... // ✅ 每个 extends 对应 Attribute 类 implements AttributeModifierXxxAttribute // 鸿蒙 74 个 Modifier 装饰器类extends XxxAttribute implements AttributeModifierXxxAttribute鸿蒙 Modifier 类清单74 个CommonModifier基座/ AlphabetIndexerModifier / BlankModifier / ButtonModifier / CalendarPickerModifier / CheckboxModifier / CheckboxGroupModifier / ColumnModifier / ColumnSplitModifier / CounterModifier / DataPanelModifier / DatePickerModifier / DividerModifier / GaugeModifier / GridModifier / GridColModifier / GridItemModifier / GridRowModifier / HyperlinkModifier / ImageAnimatorModifier / ImageModifier / SymbolGlyphModifier / ImageSpanModifier / LineModifier / ListModifier / ListItemModifier / ListItemGroupModifier / LoadingProgressModifier / MarqueeModifier / MenuModifier / MenuItemModifier / NavDestinationModifier / NavigationModifier / NavigatorModifier / NavRouterModifier / PanelModifier / PathModifier / PatternLockModifier / PolygonModifier / PolylineModifier / ProgressModifier / QRCodeModifier / RadioModifier / RatingModifier / RectModifier / RefreshModifier / RichEditorModifier / RowModifier / RowSplitModifier / ScrollModifier / SearchModifier / SelectModifier / ShapeModifier / SideBarContainerModifier / SliderModifier / SpanModifier / StackModifier / StepperItemModifier / SwiperModifier / TabsModifier / TextAreaModifier / TextModifier / TextClockModifier / TextInputModifier / TextPickerModifier / TextTimerModifier / TimePickerModifier / ToggleModifier / VideoModifier / WaterFlowModifier / ContainerSpanModifier / SymbolSpanModifier / ParticleModifier / StepperModifier。机制 2applyNormalAttribute 是方法声明不是属性——arkts-no-method-reassignment 编译错鸿蒙坑根因applyNormalAttribute是方法声明不是属性——buttonModifier.applyNormalAttribute fn编译错// ❌ 鸿蒙坑applyNormalAttribute 是方法不是属性赋值覆盖编译错 arkts-no-method-reassignment const buttonModifier: ButtonModifier new ButtonModifier() // ❌ ArkTS 禁止给对象方法重新赋值buttonModifier.applyNormalAttribute (instance) { ... } // ❌ 编译错Reassigning object methods is not supported (arkts-no-method-reassignment) // ✅ 正确用法class implements AttributeModifierTapplyNormalAttribute 是方法声明 class MyButtonModifier implements AttributeModifierButtonAttribute { applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(20) instance.backgroundColor(#28a745) instance.fontColor(#ffffff) } } // 鸿蒙坑根因applyNormalAttribute 是方法声明不是属性ArkTS 禁止给对象方法重新赋值arkts-no-method-reassignment 编译错根因ArkTS 语法规则禁止给对象方法重新赋值obj.method fn非法applyNormalAttribute在 .d.ts 里声明为方法applyNormalAttribute?(instance: ButtonAttribute): void所以buttonModifier.applyNormalAttribute fn触发arkts-no-method-reassignment编译错。正确用法是class MyModifier implements AttributeModifierT声明方法不是赋值覆盖方法。机制 3attributeModifier(modifier) 绑定装饰器实例到组件鸿蒙attributeModifier(modifier)绑定装饰器实例到组件不是 attribute 是装饰器绑定// ✅ attributeModifier 绑定装饰器实例到组件鸿蒙坑attributeModifier 绑定 AttributeModifierT 实例 const myButtonModifier: MyButtonModifier new MyButtonModifier() Entry Component struct Index { build() { // ✅ attributeModifier(modifier) 绑定装饰器实例到组件 Button(受 MyButtonModifier 装饰器控制的按钮) .attributeModifier(myButtonModifier) .onClick(() { // ✅ 装饰器控制的按钮点击applyPressedAttribute 按下态触发 }) } } // attributeModifier 绑定装饰器实例到组件不是 attribute 是装饰器绑定attributeModifier vs attribute 的区别attributeModifier(modifier)绑定的是AttributeModifierT实例装饰器类实例applyNormalAttribute 方法改 instance 属性不是单个 attribute 值fontSize/fontColor 等声明式属性。装饰器绑定是命令式 setterinstance.fontSize()声明式属性是声明式 UI.fontSize(16)。机制 4applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法鸿蒙AttributeModifierTinterface 有多个可选 apply 方法Normal/Pressed/Focused 等多状态// ✅ applyXxxAttribute 多状态Normal/Pressed/Focused 等可选方法 class MyButtonModifier implements AttributeModifierButtonAttribute { // ✅ applyNormalAttribute 正常态必选 applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(16) instance.backgroundColor(#2563eb) } // ✅ applyPressedAttribute 按下态可选状态化节点修改器多状态 applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#dc3545) instance.fontSize(22) } // ✅ applyFocusedAttribute 聚焦态可选状态化节点修改器多状态 applyFocusedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#ff6600) instance.fontSize(18) } } // applyXxxAttribute 多状态Normal/Pressed/Focused 等可选方法applyXxxAttribute 多状态方法applyNormalAttribute正常态必选/applyPressedAttribute按下态可选/applyFocusedAttribute聚焦态可选/applyDisabledAttribute禁用态可选/applySelectedAttribute选中态可选/applyPointerOverAttribute鼠标悬停态可选等。每个状态对应一个 apply 方法instance 是对应 Attribute 实例改属性用同名 setter。三、真机配图鸿蒙 ArkUI.modifier 装饰器坑——attributeModifier AttributeModifier真机配图展示鸿蒙 ArkUI.modifier 装饰器坑初始态鸿蒙 6.1 ArkUI.modifier 装饰器坑标题场景1卡片受 MyButtonModifier 装饰器控制的按钮蓝色 fontSize16 ①toggle 按钮、场景2卡片受 MyTextModifier 装饰器控制的文本黑色 fontSize14 ②toggle 按钮、鸿蒙坑卡片arkts-no-method-reassignment 错误演示、要点说明ButtonModifier toggle 态点击「① toggle MyButtonModifier 状态」按钮modifierStatus 显示「✅ MyButtonModifier 状态切换toggletrue fontSize20 bgColor#28a745」受装饰器控制的按钮已变绿色 fontSize20——状态化节点修改器验证TextModifier toggle 态点击「② toggle MyTextModifier 状态」按钮受 MyTextModifier 装饰器控制的文本已变红色 fontSize18——文本装饰器验证applyPressedAttribute 按下态点击「受 MyButtonModifier 装饰器控制的按钮」pressed1applyPressedAttribute 按下态触发按钮变红色 fontSize22——按下态验证四、真解法鸿蒙 AttributeModifier 的三个场景场景 1class implements AttributeModifier attributeModifier 绑定——90% 场景首选class implements AttributeModifier attributeModifier 绑定用AttributeModifierButtonAttributeattributeModifier(modifier)// ✅ 场景 1class implements AttributeModifierT attributeModifier 绑定API 1290% 场景首选 class MyButtonModifier implements AttributeModifierButtonAttribute { fontSize: number 16 bgColor: ResourceColor #2563eb fontColor: ResourceColor #ffffff // ✅ applyNormalAttribute 是方法声明class implements AttributeModifierT不是属性赋值 applyNormalAttribute(instance: ButtonAttribute): void { // ✅ instance 是 ButtonAttribute 实例改属性用同名 setter 方法 instance.fontSize(this.fontSize) instance.backgroundColor(this.bgColor) instance.fontColor(this.fontColor) } } const myButtonModifier: MyButtonModifier new MyButtonModifier() Entry Component struct Index { build() { // ✅ attributeModifier 绑定装饰器实例到组件 Button(受 MyButtonModifier 装饰器控制的按钮) .attributeModifier(myButtonModifier) } } // class implements AttributeModifierT attributeModifier 绑定90% 场景首选鸿蒙 AttributeModifier API 真名坑AttributeModifierTinterfaceAPI 12鸿蒙 6.1 API 23 基座applyNormalAttribute(instance: T): void正常态方法必选applyPressedAttribute(instance: T): void按下态方法可选applyFocusedAttribute(instance: T): void聚焦态方法可选applyDisabledAttribute(instance: T): void禁用态方法可选applySelectedAttribute(instance: T): void选中态方法可选attributeModifier(modifier: AttributeModifierT)绑定装饰器实例到组件74 个 Modifier 类extends 对应 Attribute 类 implements AttributeModifierSysCapSystemCapability.ArkUI.ArkUI.Fullcrossplatform跨平台atomicservice原子化服务。场景 2applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法applyXxxAttribute 多状态用applyPressedAttributeapplyFocusedAttribute等可选方法// ✅ 场景 2applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法API 12 class MyButtonModifier implements AttributeModifierButtonAttribute { applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(16) instance.backgroundColor(#2563eb) instance.fontColor(#ffffff) } // ✅ applyPressedAttribute 按下态可选方法状态化节点修改器多状态 applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#dc3545) instance.fontSize(22) } // ✅ applyFocusedAttribute 聚焦态可选方法状态化节点修改器多状态 applyFocusedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#ff6600) instance.fontSize(18) } } // applyXxxAttribute 多状态Normal/Pressed/Focused 等可选方法instance 改属性用同名 setter鸿蒙 applyXxxAttribute 多状态 API 真名坑applyNormalAttribute正常态N 首字母大写驼峰命名applyPressedAttribute按下态P 首字母大写applyFocusedAttribute聚焦态F 首字母大写applyDisabledAttribute禁用态D 首字母大写applySelectedAttribute选中态S 首字母大写applyPointerOverAttribute鼠标悬停态P 首字母大写鸿蒙坑applyNormalAttribute大小写坑——Normal 不是 normal首字母大写驼峰命名instance 改属性用同名 setter 方法instance.fontSize()/instance.backgroundColor()/instance.fontColor()。场景 3arkts-no-method-reassignment 编译错——applyNormalAttribute 是方法不是属性arkts-no-method-reassignment 编译错——buttonModifier.applyNormalAttribute fn非法// ❌ 场景 3arkts-no-method-reassignment 编译错——applyNormalAttribute 是方法不是属性 const buttonModifier: ButtonModifier new ButtonModifier() // ❌ ArkTS 禁止给对象方法重新赋值buttonModifier.applyNormalAttribute (instance) { ... } // ❌ 编译错Reassigning object methods is not supported (arkts-no-method-reassignment) // ❌ 错误信息Error Message: Reassigning object methods is not supported (arkts-no-method-reassignment) // ✅ 正确用法class implements AttributeModifierTapplyNormalAttribute 是方法声明 class MyButtonModifier implements AttributeModifierButtonAttribute { applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(20) instance.backgroundColor(#28a745) instance.fontColor(#ffffff) } } // arkts-no-method-reassignment 编译错根因applyNormalAttribute 是方法声明不是属性ArkTS 禁止给对象方法重新赋值arkts-no-method-reassignment 编译错根因ArkTS 语法规则禁止给对象方法重新赋值obj.method fn非法arkts-no-method-reassignmentapplyNormalAttribute在 .d.ts 里声明为方法applyNormalAttribute?(instance: ButtonAttribute): void所以buttonModifier.applyNormalAttribute fn触发编译错。鸿蒙坑applyNormalAttribute是方法声明不是属性——不能赋值覆盖必须 class implements AttributeModifier 声明方法。五、一句话哲学写鸿蒙 ArkUI 记住modifier 不是 React.useReducer 是「节点属性修改器」——鸿蒙 6.1 API 23ohos.arkui.modifiernamespaceAPI 1274 个 Modifier 装饰器类extends XxxAttribute implements AttributeModifierSysCap SystemCapability.ArkUI.ArkUI.Fullcrossplatform atomicservice。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute(instance: T): void是方法声明不是属性❌buttonModifier.applyNormalAttribute fn编译错arkts-no-method-reassignmentArkTS 禁止给对象方法重新赋值✅ 正确用法class MyModifier implements AttributeModifierT { applyNormalAttribute(instance) {} }attributeModifier(modifier)绑定装饰器实例到组件不是 attribute 是装饰器绑定命令式 setterapplyXxxAttribute多状态Normal/Pressed/Focused/Disabled/Selected/PointerOver 等可选方法首字母大写驼峰命名instance 改属性用同名 setterinstance.fontSize()/instance.backgroundColor()/instance.fontColor()。节点属性修改器 applyNormalAttribute 是方法不是属性是鸿蒙 6.1 ArkUI.modifier 装饰器坑核心能力系列回链鸿蒙 7.0 新特性篇 1~17沉浸式毛玻璃/Component3D/智能体框架/方舟引擎/星盾安全/星河互联/空间音频/可变字体/游戏快启/分布式数据盾/LTPO 可变帧率/AI 文档识别/多形态服务窗口/AI 反诈/机密计算/空间计算/小艺全面进化鸿蒙 6.1 API 23 开发坑系列篇 1「ArkUI.modifier 装饰器坑」——attributeModifier AttributeModifier 状态化节点修改器本文真机 demo 完整代码// 鸿蒙 6.1 API 23 开发坑系列篇 1ArkUI.modifier 装饰器坑——attributeModifier AttributeModifierT 状态化节点修改器根因 // 本 demo 用 attributeModifier 绑定 自定义 class implements AttributeModifierButtonAttribute 演示鸿蒙 6.1 装饰器根因本机 API 21 可跑 // 鸿蒙坑根因applyNormalAttribute 是方法不是属性——arkts-no-method-reassignment 禁止 buttonModifier.applyNormalAttribute fn 赋值必须 class implements AttributeModifierT // ✅ 自定义 AttributeModifierButtonAttribute 实现类正确用法class implements不是赋值覆盖方法 class MyButtonModifier implements AttributeModifierButtonAttribute { fontSize: number 16 bgColor: ResourceColor #2563eb fontColor: ResourceColor #ffffff // ✅ applyNormalAttribute 是方法声明class implements AttributeModifierT不是属性赋值 applyNormalAttribute(instance: ButtonAttribute): void { // ✅ instance 是 ButtonAttribute 实例改属性用同名 setter 方法 instance.fontSize(this.fontSize) instance.backgroundColor(this.bgColor) instance.fontColor(this.fontColor) } // ✅ applyPressedAttribute 按下态可选方法状态化节点修改器多状态 applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#dc3545) instance.fontSize(22) } // ✅ applyFocusedAttribute 聚焦态可选方法状态化节点修改器多状态 applyFocusedAttribute(instance: ButtonAttribute): void { instance.backgroundColor(#ff6600) instance.fontSize(18) } } // ✅ 自定义 AttributeModifierTextAttribute 实现类文本装饰器 class MyTextModifier implements AttributeModifierTextAttribute { fontSize: number 14 fontColor: ResourceColor #333333 applyNormalAttribute(instance: TextAttribute): void { instance.fontSize(this.fontSize) instance.fontColor(this.fontColor) } } // ✅ 全局 Modifier 实例attributeModifier 绑定用 const myButtonModifier: MyButtonModifier new MyButtonModifier() const myTextModifier: MyTextModifier new MyTextModifier() Entry Component struct Index { State log: string (未操作) State modifierStatus: string (未用) State toggleState: boolean false State pressedCount: number 0 State focusedCount: number 0 State normalCount: number 0 State currentButtonFontSize: number 16 State currentButtonBgColor: string #2563eb aboutToAppear() { this.log 鸿蒙 6.1 ArkUI.modifier 装饰器坑74 个 Modifier 类attributeModifier AttributeModifierT 状态化节点修改器 } // ✅ 场景 1切换 MyButtonModifier 状态改实例属性后刷新绑定 toggleButtonState() { this.toggleState !this.toggleState if (this.toggleState) { myButtonModifier.fontSize 20 myButtonModifier.bgColor #28a745 myButtonModifier.fontColor #ffffff this.currentButtonFontSize 20 this.currentButtonBgColor #28a745 } else { myButtonModifier.fontSize 16 myButtonModifier.bgColor #2563eb myButtonModifier.fontColor #ffffff this.currentButtonFontSize 16 this.currentButtonBgColor #2563eb } this.modifierStatus ✅ MyButtonModifier 状态切换toggle this.toggleState fontSize myButtonModifier.fontSize bgColor this.currentButtonBgColor this.log ✅ MyButtonModifier 实例属性切换成功applyNormalAttribute 下次渲染按新属性改节点 this.normalCount } // ✅ 场景 2切换 MyTextModifier 状态 toggleTextState() { if (myTextModifier.fontSize 14) { myTextModifier.fontSize 18 myTextModifier.fontColor #dc3545 } else { myTextModifier.fontSize 14 myTextModifier.fontColor #333333 } this.modifierStatus ✅ MyTextModifier 状态切换fontSize myTextModifier.fontSize this.log ✅ MyTextModifier 实例属性切换成功applyNormalAttribute 下次渲染按新属性改节点 } build() { Column({ space: 8 }) { Text(鸿蒙 6.1 ArkUI.modifier 装饰器坑) .fontSize(18).fontWeight(FontWeight.Bold).margin({ top: 16, bottom: 4 }) Text(attributeModifier AttributeModifierT 状态化节点修改器根因) .fontSize(11).fontColor(#888).margin({ bottom: 8 }) // ✅ 场景 1attributeModifier 绑定 MyButtonModifier正确用法 Column({ space: 6 }) { Text(场景 1attributeModifier 绑定 MyButtonModifierAPI 12class implements AttributeModifierT) .fontSize(12).fontColor(#2563eb).fontWeight(FontWeight.Bold) Text(class MyButtonModifier implements AttributeModifierButtonAttributeapplyNormalAttribute(instance) 改属性) .fontSize(9).fontColor(#888) // ✅ attributeModifier 绑定装饰器实例到组件鸿蒙坑attributeModifier 绑定 AttributeModifierT 实例 Button(受 MyButtonModifier 装饰器控制的按钮) .attributeModifier(myButtonModifier) .height(40) .margin({ top: 4 }) .onClick(() { this.pressedCount this.log ✅ 装饰器控制的按钮点击成功pressedCount this.pressedCount }) Button(① toggle MyButtonModifier 状态).height(30).fontSize(9).backgroundColor(#2563eb20) .onClick(() this.toggleButtonState()) Text(this.modifierStatus).fontSize(9).fontColor(#2563eb).margin({ top: 4 }) Text(当前按钮状态fontSize${this.currentButtonFontSize} bgColor${this.currentButtonBgColor}) .fontSize(8).fontColor(#2563eb).margin({ top: 2 }) } .width(92%).padding(8).backgroundColor(#e0f0ff).borderRadius(8) // ✅ 场景 2attributeModifier 绑定 MyTextModifier Column({ space: 6 }) { Text(场景 2attributeModifier 绑定 MyTextModifierAPI 12文本装饰器) .fontSize(12).fontColor(#ff6600).fontWeight(FontWeight.Bold) Text(class MyTextModifier implements AttributeModifierTextAttributeapplyNormalAttribute(instance) 改属性) .fontSize(9).fontColor(#888) // ✅ attributeModifier 绑定文本装饰器 Text(受 MyTextModifier 装饰器控制的文本) .attributeModifier(myTextModifier) .margin({ top: 4 }) Button(② toggle MyTextModifier 状态).height(30).fontSize(9).backgroundColor(#ff660020) .onClick(() this.toggleTextState()) } .width(92%).padding(8).backgroundColor(#fff3e0).borderRadius(8) // ✅ 鸿蒙坑arkts-no-method-reassignment 错误演示注释说明 Column({ space: 6 }) { Text(鸿蒙坑arkts-no-method-reassignment 编译错applyNormalAttribute 是方法不是属性) .fontSize(12).fontColor(#dc3545).fontWeight(FontWeight.Bold) Text(❌ buttonModifier.applyNormalAttribute fn → 编译错 arkts-no-method-reassignment) .fontSize(9).fontColor(#dc3545) Text(✅ 正确class MyModifier implements AttributeModifierT { applyNormalAttribute(instance) {} }) .fontSize(9).fontColor(#28a745) Text(鸿蒙坑根因applyNormalAttribute 是方法声明不是属性ArkTS 禁止给对象方法重新赋值) .fontSize(8).fontColor(#6c757d).margin({ top: 4 }) } .width(92%).padding(8).backgroundColor(#f8d7da).borderRadius(8) // ✅ 鸿蒙 ArkUI.modifier 装饰器坑要点 Column({ space: 3 }) { Text(鸿蒙 6.1 ArkUI.modifier 装饰器坑要点) .fontSize(10).fontColor(#6c757d).fontWeight(FontWeight.Bold) Text(① ohos.arkui.modifier namespace API 12鸿蒙 6.1 API 23 基座74 个 Modifier 类) .fontSize(8).fontColor(#2563eb) Text(② 每个 Modifier 类 extends 对应 Attribute 类 implements AttributeModifierXxxAttribute) .fontSize(8).fontColor(#ff6600) Text(③ applyNormalAttribute(instance: XxxAttribute): void 改属性状态化节点修改器根因) .fontSize(8).fontColor(#28a745) Text(④ instance 是 XxxAttribute 实例改属性用同名 setter 方法instance.fontSize/backgroundColor/fontColor) .fontSize(8).fontColor(#dc3545) Text(⑤ ❌ applyNormalAttribute 是方法不是属性buttonModifier.applyNormalAttribute fn 编译错) .fontSize(8).fontColor(#dc3545) Text(⑥ ✅ 正确用法class MyModifier implements AttributeModifierT { applyNormalAttribute(instance) {} }) .fontSize(8).fontColor(#28a745) Text(⑦ attributeModifier(modifier) 绑定装饰器实例到组件不是 attribute 是装饰器绑定) .fontSize(8).fontColor(#ff6600) Text(⑧ applyXxxAttribute 多状态applyNormalAttribute/applyPressedAttribute/applyFocusedAttribute 等可选) .fontSize(8).fontColor(#6c757d) Text(⑨ 装饰器是节点修改器不是 Component——通过 applyXxxAttribute 方法改节点属性不是声明式 UI) .fontSize(8).fontColor(#ffc107) Text(⑩ React 对比modifier 不是 React.useReducer——鸿蒙装饰器是节点属性修改器不是状态管理 hook) .fontSize(8).fontColor(#17a2b8) } .width(92%).padding(6).backgroundColor(#f8f9fa).borderRadius(8) // ✅ 统计 Row({ space: 12 }) { Text(normal: ${this.normalCount}).fontSize(9).fontColor(#28a745) Text(pressed: ${this.pressedCount}).fontSize(9).fontColor(#dc3545) Text(focused: ${this.focusedCount}).fontSize(9).fontColor(#ff6600) } .margin({ top: 6 }) Text(日志${this.log}).fontSize(9).fontColor(#333).margin({ top: 6 }) Text(鸿蒙 6.1API 12ArkUI.modifier74 个 Modifier 类attributeModifier AttributeModifierT 状态化节点修改器) .fontSize(8).fontColor(#6c757d).margin({ top: 6 }) } .width(100%).height(100%).alignItems(HorizontalAlign.Center) } }写鸿蒙 ArkUI 记住modifier 不是 React.useReducer 是「节点属性修改器」——鸿蒙 6.1 API 23ohos.arkui.modifiernamespaceAPI 1274 个 Modifier 装饰器类extends XxxAttribute implements AttributeModifierSysCap SystemCapability.ArkUI.ArkUI.Fullcrossplatform atomicservice。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute(instance: T): void是方法声明不是属性❌buttonModifier.applyNormalAttribute fn编译错arkts-no-method-reassignmentArkTS 禁止给对象方法重新赋值✅ 正确用法class MyModifier implements AttributeModifierT { applyNormalAttribute(instance) {} }attributeModifier(modifier)绑定装饰器实例到组件不是 attribute 是装饰器绑定命令式 setterapplyXxxAttribute多状态Normal/Pressed/Focused/Disabled/Selected/PointerOver 等可选方法首字母大写驼峰命名instance 改属性用同名 setterinstance.fontSize()/instance.backgroundColor()/instance.fontColor()。节点属性修改器 applyNormalAttribute 是方法不是属性是鸿蒙 6.1 ArkUI.modifier 装饰器坑核心

相关新闻

终极指南:轻松解决Windows软件依赖问题的Visual C++运行库合集

终极指南:轻松解决Windows软件依赖问题的Visual C++运行库合集

终极指南:轻松解决Windows软件依赖问题的Visual C运行库合集 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾遇到过游戏无法启动、专业软件闪…

2026/9/26 10:04:26 阅读更多 →
JSON.lua 架构设计与性能优化深度解析

JSON.lua 架构设计与性能优化深度解析

JSON.lua 架构设计与性能优化深度解析 【免费下载链接】json.lua A lightweight JSON library for Lua 项目地址: https://gitcode.com/gh_mirrors/js/json.lua JSON.lua 是一款专为Lua环境设计的轻量级JSON解析库,以其纯Lua实现、卓越性能和极致精简的设计理…

2026/10/2 8:47:51 阅读更多 →
构建高弹性系统:Architectural Metapatterns中的微内核与插件架构实践

构建高弹性系统:Architectural Metapatterns中的微内核与插件架构实践

构建高弹性系统:Architectural Metapatterns中的微内核与插件架构实践 【免费下载链接】metapatterns Architectural Metapatterns book and wiki 项目地址: https://gitcode.com/gh_mirrors/publications13/metapatterns 在软件开发领域,构建具有…

2026/10/12 15:21:16 阅读更多 →

最新新闻

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

拿到一块iMX8M板卡,A53那边跑着Linux做业务逻辑,M4这边想跑FreeRTOS管实时控制,第一个绕不开的问题就是:这两个核之间到底怎么通信。我在实际项目里试过几种土办法——共享变量太脆弱,串口又太慢,敲了半天代…

2026/10/14 20:53:22 阅读更多 →
802.11-2020 PDF高效阅读指南:条款定位与测试基线实战

802.11-2020 PDF高效阅读指南:条款定位与测试基线实战

简介:此PDF为IEEE 802.11-2020标准的正式版全文,属于无线局域网领域的核心规范,面向网络工程师、通信专业学生与科研人员,用于理解WLAN介质访问控制层与物理层的完整定义。该版本由IEEE计算机协会LAN/MAN标准委员会开发&#xff0…

2026/10/14 20:53:22 阅读更多 →
ArcGIS Pro 2.5发布OSGB三维模型失败原因与修复指南

ArcGIS Pro 2.5发布OSGB三维模型失败原因与修复指南

1. 为什么OSGB在ArcGIS Pro 2.5里突然“变难了”——从模型加载到服务发布的断层真相你是不是也遇到过这样的情况:用ContextCapture或Pix4D生成的OSGB倾斜摄影模型,在本地ArcGIS Pro里打开时缩放流畅、纹理清晰,连瓦片层级切换都丝滑&#xf…

2026/10/14 20:53:22 阅读更多 →
Wing 模拟器中的 sim.Container:从 entrypoint 测试快照看自定义容器启动与底层实现

Wing 模拟器中的 sim.Container:从 entrypoint 测试快照看自定义容器启动与底层实现

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/14 20:53:22 阅读更多 →
JDK 11.0.15 Linux部署指南:TLS 1.3与GC调优实战

JDK 11.0.15 Linux部署指南:TLS 1.3与GC调优实战

简介:本资源为Linux平台下Java 11.0.15正式版JDK标准发行包(jdk-11.0.15_linux-x64_bin.tar.gz),面向Java初学者、Linux服务器开发者及需要稳定LTS版本JDK的生产环境部署人员,解决跨平台开发、服务端编译运行及JVM调优…

2026/10/14 20:53:22 阅读更多 →
Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

1. 从一次线上故障说起&#xff1a;为什么要搞清楚服务注册与暴露很多同学用 Dubbo 做微服务&#xff0c;配置文件里写个<dubbo:service>或者加个DubboService注解&#xff0c;服务就能被调用了&#xff0c;至于背后发生了什么&#xff0c;基本靠“框架自动搞定”这句话糊…

2026/10/14 20:52:20 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →