有没有HarmonyOS鸿蒙Next工程师大佬帮忙解惑

有没有HarmonyOS鸿蒙Next工程师大佬帮忙解惑

  1. default 有什么用? 能否通过代码体现出来? 我记得在项目中有看到通过 default 对自定义注解进行传参或者获取之类的, 可能记错了

  2. 目前路由已知有 router 和 navigation, 三方库里面知道的有 HMRouter, 原理是什么? 能否不通过这些来实现路由

  3. 能否优美的实现在定义监听事件代码

  4. WrappedBuilder 到底怎么用, 当前已知的是可以传入 全局 @Buidler 声明的函数, 但是怎么获取想要的内容, 准备定义 WrappedBuilder 数组, 通过类似键值的形式来获取, 可能描述不准确

  5. 鸿蒙的系统组件能看到源码吗? 我想知道实现原理, 试着看看能不能自己写几个

  6. 自定义组件能不能存入 map 集合, 通过键值对的形式进行操作, 也可以存入其他集合


更多关于有没有HarmonyOS鸿蒙Next工程师大佬帮忙解惑的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复
  1. default 在 ArkTS 中主要用于模块的默认导出(如类、函数、对象),允许其他文件通过 import 直接引用该默认导出内容
// 模块A.ets
export default class MyComponent {}  
// 模块B.ets
import MyComponent from './ModuleA'; // 直接导入默认导出的类
  1. routerNavigation:基于页面栈管理,通过 push/pop 操作控制页面跳转,支持参数传递和页面生命周期管理。HMRouter 通常封装系统路由能力,扩展动态路由表、拦截器等功能。

  2. 事件监听的优雅实现

//组件内事件定义与触发
//使用 @Event 和 @Emit 装饰器(API 10+):
@Component
struct CustomButton {
  @Event onPress: () => void;

  build() {
    Button('Click').onClick(() => this.onPress())
  }
}

//父组件监听子组件事件
@State count: number = 0;

build() {
  CustomButton()
    .onPress(() => this.count++)
}
  1. @WrappedBuilder 用于包装构建函数,实现动态 UI 组合
const builderMap: Map<string, () => void> = new Map([
  ['header', HeaderBuilder],
  ['footer', FooterBuilder]
]);

build() {
  // 根据键获取对应的 Builder
  const targetBuilder = builderMap.get('header');
  Column() {
    targetBuilder()
  }
}
  1. 鸿蒙系统组件源码未开放,但可通过以下方式了解原理:

调试工具:使用 DevEco Studio 的布局边界检查(.debug(true))观察组件结构。

接口文档:查阅组件 API 说明(如 Text、Button 的属性与方法)。

自定义组件扩展:通过组合系统组件实现类似功能。

  1. ArkUI 的声明式特性决定了组件实例无法直接存入 Map 等集合

可以通过如下方式

//存储组件构建逻辑:将 @Builder 函数存入集合,按需调用。
//条件渲染控制:通过 @State 变量动态决定渲染哪个组件:

@State componentKey: string = 'button';
build() {
  if (this.componentKey === 'button') {
    CustomButton()
  } else if (this.componentKey === 'text') {
    CustomText()
  }
}

更多关于有没有HarmonyOS鸿蒙Next工程师大佬帮忙解惑的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


1default用途及示例

ArkTS 中,default 主要用于模块导出默认值,或在装饰器中指定默认参数。如果通过 @CustomDecorator() 不传参,则 name 会使用默认值 ‘default’

// 定义装饰器时使用 default 设置默认值

function CustomDecorator(options: { name?: string } = { name: 'default' }) {

  // 装饰器逻辑

}

[@Component](/user/Component)
struct MyComponent {

  [@CustomDecorator](/user/CustomDecorator)({ name: 'custom' }) // 传参覆盖默认值
  build() { /*...*/ }
}

2路由实现原理与替代方案

通过 NavPathStack 维护页面层级,push/pop 方法切换页面,结合路由表(route_map.json)定义页面路径。

不依赖三方库的实现:

// 配置路由表 route_map.json
{
  "routerMap": [
    { "name": "Page2", "pageSourceFile": "pages/Page2.ets" }
  ]
}

// 页面跳转
this.pageStack.pushPathByName('Page2', null);

通过 Navigation 组件和路由表即可实现基础路由。

3事件监听优化方案

优美的事件监听可通过 箭头函数 或 状态绑定 实现,状态变化会自动触发 UI 更新,减少手动监听代码

// 使用箭头函数简化回调
Button('点击')
  .onClick(() => this.handleClick())

// 结合状态管理自动触发
@State count: number = 0;

Text(`${this.count}`)
  .onClick(() => this.count++)

4WrappedBuilder 使用技巧

@Builder 装饰的函数可作为参数传递,通过 键值对管理。在 Navigation 中可直接传入 Page2Builder 函数构建页面

// 定义全局 Builder 集合
const builders: Map<string, () => void> = new Map([
  ['page1', Page1Builder],
  ['page2', Page2Builder]
]);

// 调用时通过键获取
builders.get('page1')?.();

5系统组件源码查看

鸿蒙系统组件源码未完全公开,但楼主可以查看官方文档中的组件接口定义;参考 OpenHarmony 开源项目的部分实现或者通过扩展 @Component 自定义组件,复用系统组件接口。

6自定义组件存储方案

组件实例无法直接存入集合,但可通过 Builder 函数 或 条件渲染 实现类似效果

// 存储 Builder 函数
const componentMap: Map<string, () => void> = new Map([
  ['btn', () => Button('按钮')]
]);

// 动态渲染
Column() {
  componentMap.forEach((builder) => {
    builder()
  })
}

鸿蒙Next相关问题请直接提出具体技术问题。目前鸿蒙Next采用ArkTS作为主要开发语言,基于声明式UI框架,支持Stage模型应用开发。系统架构上采用分布式设计,支持一次开发多端部署。开发工具推荐使用DevEco Studio 4.1及以上版本。请注意鸿蒙Next不再兼容Android APK,需使用HAP格式打包。

  1. 关于default:在HarmonyOS中,default通常用于注解的默认值设置。例如:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "defaultValue";
}

使用时可以通过反射获取注解的默认值。

  1. 路由实现:
  • router/navigation是官方路由方案,基于页面路径进行跳转
  • 原理是通过统一的URL路由表进行页面映射
  • 可以不使用官方路由,自己实现基于Ability的跳转逻辑
  1. 事件监听优化: 推荐使用Lambda表达式:
button.setClickedListener(component -> {
    // 处理点击事件
});
  1. WrappedBuilder使用:
@Builder
static void MyBuilder(Component component) {
    // builder逻辑
}

// 使用
WrappedBuilder wrapped = WrappedBuilder.create(this, MyBuilder);
  1. 系统组件源码: 目前HarmonyOS Next不开放系统组件源码,但可以通过开发者文档了解组件API和使用方式。

  2. 自定义组件存储: 可以将Component对象存入Map,但要注意生命周期管理。建议存储组件ID而非组件实例。

回到顶部