• 作者:老汪软件技巧
  • 发表时间:2024-08-23 10:02
  • 浏览量:

鸿蒙部分工具类封装前言

前几篇文章把权限、网络请求、文件上传下载、相册选取、录像拍照等功能做了封装,最近工作也写了点简单的工具类,单独写一篇文章又太多,不写的话又感觉少了点什么,这篇文章就一起记录几个工具类吧。

日志

其实鸿蒙的 hvigor-config.json5 文件里面可以配置日志等级,我又没事多封装了一层:

  "logging": {
    "level": "info"
    /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */
  },

下面是我封装的:

/**
 * 日志工具类
 *
 * @author fdk 2024-06-26
 */
class LogUtil {
  /** 开启日志输出 **/
  static openLog = true
  /** 日志输出级别 **/
  static logLevel = 0
  /**
   * 受控日志输出
   * @param message 消息
   * @param args 多个输出消息
   */
  static log(message: string, ...args: string[]) {
    if (LogUtil.openLog) {
      if (args && args.length > 0) {
        console.log(message, args)
      }else {
        console.log(message)
      }
    }
  }
  /**
   * 受控日志输出
   * @param message 消息
   * @param args 多个输出消息
   */
  static v(message: string, ...args: string[]) {
    if (LogUtil.openLog && LogUtil.logLevel <= 0) {
      if (args && args.length > 0) {
        console.log(message, args)
      }else {
        console.log(message)
      }
    }
  }
  /**
   * 受控日志输出
   * @param message 消息
   * @param args 多个输出消息
   */
  static d(message: string, ...args: string[]) {
    if (LogUtil.openLog && LogUtil.logLevel <= 1) {
      if (args && args.length > 0) {
        console.debug(message, args)
      }else {
        console.debug(message)
      }
    }
  }
  /**
   * 受控日志输出
   * @param message 消息
   * @param args 多个输出消息
   */
  static i(message: string, ...args: string[]) {
    if (LogUtil.openLog && LogUtil.logLevel <= 2) {
      if (args && args.length > 0) {
        console.info(message, args)
      }else {
        console.info(message)
      }
    }
  }
  /**
   * 受控日志输出
   * @param message 消息
   * @param args 多个输出消息
   */
  static w(message: string, ...args: string[]) {
    if (LogUtil.openLog && LogUtil.logLevel <= 3) {
      if (args && args.length > 0) {
        console.warn(message, args)
      }else {
        console.warn(message)
      }
    }
  }
  /**
   * 受控日志输出
   * @param message 消息
   * @param args 多个输出消息
   */
  static e(message: string, ...args: string[]) {
    if (LogUtil.openLog && LogUtil.logLevel <= 4) {
      if (args && args.length > 0) {
        console.error(message, args)
      }else {
        console.error(message)
      }
    }
  }
}
export default LogUtil

其实有保存计划的话,自己保存一层也不是不可以。

鸿蒙系统工具_鸿蒙工具软件_

国际化

这里的国际化比较简单,基本上就是套API了:

import { i18n } from '@kit.LocalizationKit';
import LogUtil from './LogUtil';
/**
 * 多语言工具类
 *
 * @author fdk 2024-07-12
 */
export class I18nUtil{
  /**
   * 获取系统语言
   *
   * @returns systemLanguage,当前系统语言
   */
  getSystemLanguage() {
    try {
      // systemLanguage为当前系统语言
      return i18n.System.getSystemLanguage();
    } catch(error) {
      LogUtil.e(error)
    }
    return "";
  }
  /**
   * 获取系统区域
   *
   * @returns systemLanguage,当前系统区域
   */
  getSystemLocale() {
    try {
      // systemLanguage为当前系统区域
      return i18n.System.getSystemLocale();
    } catch(error) {
      LogUtil.e(error)
    }
    return "";
  }
  /**
   * 获取偏好语言
   *
   * @returns appPreferredLanguage,应用的偏好语言
   */
  getAppPreferredLanguage() {
    try {
      // systemLanguage为当前系统语言
      return i18n.System.getAppPreferredLanguage();
    } catch(error) {
      LogUtil.e(error)
    }
    return "";
  }
  /**
   * 设置偏好语言
   *
   * @returns appPreferredLanguage,应用的偏好语言
   */
  setAppPreferredLanguage(language: string) {
    try {
      // 设置应用偏好语言为,PS: zh-Hans
      i18n.System.setAppPreferredLanguage(language);
    } catch(error) {
      LogUtil.e(error)
    }
  }
}

Preferences工具类

Preferences工具类在 Android 也很常见,不过我在鸿蒙发现一个问题,就是它的长度限制了8192字节,几个文档有冲突,我这做了个扩展:

import { preferences } from '@kit.ArkData';
import LogUtil from './LogUtil';
/**
 * 键值对数据保存工具类
 *
 * @author lfq 2024-07-12
 */
export class PreferencesUtil {
  /** 页面上下文 **/
  context: Context = null!
  preference: preferences.Preferences = null!
  /**
   * 传入context
   *
   * @param context 上下文
   */
  constructor(context: Context) {
    this.context = context;
    // 创建preference
    let options: preferences.Options = { name: 'xxx' };
    this.preference = preferences.getPreferencesSync(context, options);
  }
  /**
   * 检查是否有数据
   *
   * @param key 键
   */
  has(key: string): boolean {
    return this.preference.hasSync(key);
  }
  /**
   * 写入数据
   *
   * @param key 键
   * @param value 值
   * @param isFlush 是否持久化保存
   */
  put(key: string, value: string, isFlush: boolean = true) {
    try {
      if (value && value.length >= 2048) {
        let centerIndex = value.length / 2;
        let startStr = value.substring(0, centerIndex);
        let endStr = value.substring(centerIndex, value.length);
        let overLength = "overLength";
        this.put(key, overLength);
        this.put(key + "_0" , startStr);
        this.put(key + "_1" , endStr);
      }else {
        this.preference.put(key, value).then(() => {
          if (isFlush) {
            this.preference.flush();
          }
        });
      }
    } catch (error) {
      LogUtil.e("Preference put value fail: ", error.message);
    }
  }
  /**
   * 写入数据
   *
   * @param map 键
   * @param isFlush 值
   */
  putAll(map: Map<string, string>, isFlush: boolean = true) {
    map.forEach((value, key)=>{
      this.preference.put(key, value);
    });
    if (isFlush) {
      this.preference.flush();
    }
  }
  /**
   * 读取数据
   *
   * @param key 键
   * @returns value 值
   */
  get(key: string): string {
    let value = this.preference.getSync(key, "");
    if (value === "overLength") {
      let startStr = this.get(key + "_0");
      let endStr = this.get(key + "_1");
      return startStr + endStr;
    }
    return value.toString();
  }
  /**
   * 删除数据
   *
   * @param key 键
   */
  delete(key: string, isFlush: boolean = true) {
    this.preference.delete(key);
    if (isFlush) {
      this.preference.flush();
    }
  }
}

小结

这里就写了三个工具类: 国际化、日志、Preference,加上前面的权限、网络请求、文件上传下载、相册选取、录像拍照等功能,开发简单APP应该容易些了。