- 作者:老汪软件技巧
- 发表时间: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应该容易些了。