鸿蒙开发中的那些工具函数
2025-06-04 12:53:44
228次阅读
0个评论
鸿蒙开发中的那些工具函数
前言
最近在搞鸿蒙开发,发现 util 这个工具包还挺好用的,里面有不少实用的函数。今天就来分享一下我平时用得比较多的几个,希望能帮到大家。
开发环境
- DevEco Studio 4.0
- HarmonyOS SDK API 14(鸿蒙 5.0)
- 测试设备:华为 Mate 60 Pro
常用工具函数
1. 导入包
import { util } from '@kit.ArkTS';
2. 字符串处理
// 字符串格式化,这个用得最多
let name = '张三';
let age = 25;
let str = util.format('我叫%s,今年%d岁', name, age);
console.info(str);  // 输出: 我叫张三,今年25岁
// 对象转字符串,调试的时候经常用
const person = {
  name: '张三',
  age: 25,
  address: {
    city: '北京',
    country: '中国'
  }
};
console.info(util.format('个人信息: %j', person));
// 输出: 个人信息: {"name":"张三","age":25,"address":{"city":"北京","country":"中国"}}
// 数字格式化,处理小数点的时候挺方便
const pi = 3.141592653;
console.info(util.format('π的值是: %f', pi));  // 输出: π的值是: 3.141592653
3. 错误处理
// 获取错误信息,调试必备
let errnum = -1;
let result = util.errnoToString(errnum);
console.info("错误信息: " + result);  // 输出: 错误信息: operation not permitted
// 常见错误码,建议收藏
const errorCodes = {
  '-1': 'operation not permitted',
  '-2': 'no such file or directory',
  '-3': 'no such process',
  '-4': 'interrupted system call',
  '-5': 'i/o error',
  '-11': 'resource temporarily unavailable',
  '-12': 'not enough memory',
  '-13': 'permission denied',
  '-100': 'network is down'
};
4. 异步处理
// 回调转 Promise,老代码改造必备
async function fetchData() {
  return 'hello world';
}
let cb = util.callbackWrapper(fetchData);
cb((err: Object, ret: string) => {
  if (err) throw new Error;
  console.info(ret);  // 输出: hello world
});
// Promise 化,写起来更爽
const addCall = util.promisify(util.callbackWrapper(fetchData));
(async () => {
  try {
    let res: string = await addCall();
    console.info(res);  // 输出: hello world
  } catch (err) {
    console.info(err);
  }
})();
5. UUID 生成
// 生成 UUID,做唯一标识的时候用
let uuid = util.generateRandomUUID(true);
console.info("UUID: " + uuid);  // 输出类似: 84bdf796-66cc-4655-9b89-d6218d100f9c
// 二进制 UUID,特殊场景用
let binaryUuid = util.generateRandomBinaryUUID(true);
console.info(JSON.stringify(binaryUuid));  // 输出二进制数组
// UUID 转换,偶尔会用到
let parsedUuid = util.parseUUID("84bdf796-66cc-4655-9b89-d6218d100f9c");
console.info("解析后的 UUID: " + parsedUuid);
6. Base64 编解码
// 同步编码,简单场景用
let base64 = new util.Base64();
let array = new Uint8Array([115, 49, 51]);
let encoded = base64.encodeSync(array);
console.info("编码结果: " + encoded);  // 输出: 99,122,69,122
// 同步编码为字符串,最常用
let encodedStr = base64.encodeToStringSync(array);
console.info("编码字符串: " + encodedStr);  // 输出: czEz
// 同步解码,配合上面用
let decoded = base64.decodeSync(encodedStr);
console.info("解码结果: " + decoded);  // 输出: 115,49,51
// 异步编码,大数据量用
base64.encode(array).then((val) => {
  console.info("异步编码结果: " + val.toString());
});
// 异步编码为字符串,图片处理常用
base64.encodeToString(array).then((val) => {
  console.info("异步编码字符串: " + val);
});
// 异步解码,配合上面用
base64.decode(encoded).then((val) => {
  console.info("异步解码结果: " + val.toString());
});
// 图片转 Base64,上传图片的时候经常用
async function imageToBase64(imageData: Uint8Array): Promise<string> {
  try {
    return await base64.encodeToString(imageData);
  } catch (err) {
    console.error('图片转 Base64 失败:', err);
    return '';
  }
}
// Base64 转图片,下载图片的时候用
async function base64ToImage(base64Str: string): Promise<Uint8Array> {
  try {
    return await base64.decode(base64Str);
  } catch (err) {
    console.error('Base64 转图片失败:', err);
    return new Uint8Array();
  }
}
7. 实际应用
下面是一个简单的例子,把这些功能都串起来用:
@Entry
@Component
struct UtilExample {
  @State message: string = '';
  @State uuid: string = '';
  @State base64Result: string = '';
  aboutToAppear() {
    // 字符串处理
    let name = '张三';
    this.message = util.format('欢迎 %s 使用鸿蒙应用', name);
    // 生成 UUID
    this.uuid = util.generateRandomUUID(true);
    // 错误处理
    try {
      let errnum = -1;
      let errorMsg = util.errnoToString(errnum);
      console.info('错误信息:', errorMsg);
    } catch (err) {
      console.error('发生错误:', err);
    }
    // Base64 测试
    let testData = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
    let base64 = new util.Base64();
    this.base64Result = base64.encodeToStringSync(testData);
    console.info('Base64 编码结果:', this.base64Result);
  }
  build() {
    Column() {
      Text(this.message)
        .fontSize(20)
        .margin({ top: 20 })
      
      Text('UUID: ' + this.uuid)
        .fontSize(16)
        .margin({ top: 10 })
      
      Text('Base64: ' + this.base64Result)
        .fontSize(16)
        .margin({ top: 10 })
      
      Button('测试异步')
        .onClick(async () => {
          async function testAsync() {
            return '测试成功';
          }
          
          const asyncCall = util.promisify(util.callbackWrapper(testAsync));
          try {
            let result = await asyncCall();
            console.info('异步测试结果:', result);
          } catch (err) {
            console.error('异步测试错误:', err);
          }
        })
      
      Button('测试 Base64')
        .onClick(async () => {
          let base64 = new util.Base64();
          let testData = new Uint8Array([72, 101, 108, 108, 111]);
          
          try {
            let encoded = await base64.encodeToString(testData);
            console.info('异步编码结果:', encoded);
            
            let decoded = await base64.decode(encoded);
            console.info('异步解码结果:', decoded);
          } catch (err) {
            console.error('Base64 操作失败:', err);
          }
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}
踩过的坑
- 字符串格式化的时候,%s 和 %d 用错了,结果输出不对
- 异步函数包装的时候,回调函数的参数顺序写反了,调试了半天
- UUID 生成的时候,缓存没设置好,性能有点问题
- 错误码和实际错误信息对不上,查了半天文档
- Base64 编解码的时候,输入数据类型不对,报错
- Base64 异步操作忘记处理异常,程序崩了
总结
鸿蒙 5.0 的 util 工具函数还是挺好用的,能省不少事。不过用之前最好先看看文档,了解下具体用法,免得踩坑。
参考资料
后记
写这篇文章的时候,发现鸿蒙 5.0 的工具函数比以前好用多了。如果大家有什么问题,欢迎在评论区讨论。
00
- 0回答
- 0粉丝
- 0关注
相关话题
- 鸿蒙开发:DevEcoStudio中那些实用的小功能
- 鸿蒙开发:ForEach中为什么键值生成函数很重要
- 鸿蒙开发:那些常用的资源管理方法
- 鸿蒙原生开发手记:05-开发之外的那些
- 鸿蒙开发实战:鸿蒙应用开发中的页面管理工具类详解
- 鸿蒙开发:CodeGenie,一个DevEcoStudio中自带的AI编程工具
- DevEcoStudio中的AI编程工具CodeGenie
- 鸿蒙-那些年我们踩过的坑-下
- 鸿蒙--那些年我们踩过的坑(上)
- 鸿蒙开发:DevEcoStudio中的代码生成
- 鸿蒙开发:DevEcoStudio中的代码提取
- 鸿蒙开发中的组件样式复用
- 鸿蒙开发:正则中的match和matchAll
- 鸿蒙开发:hvigor插件中的文件操作
- 鸿蒙开发:DevEcoTesting中的稳定性测试
