Prechádzať zdrojové kódy

2025年10月15日basic更新:
1、新增windowHelper类,可以在其初始化后任意位置获取到WindowStage实例.
2、新增tk广告聚合.
3、contextHelper新增oldContext,以应对某些只能使用getContext()的过时方法.
4、新增YTObjectUtils工具类,使用ts绕过ets限制,使操作对象更加简便,当前为测试版,会不定时更新.
5、新增Singleton抽象类,其子类均为单例,简化了定义单例的步骤.

wangcy 3 týždňov pred
rodič
commit
97165c6613
25 zmenil súbory, kde vykonal 182 pridanie a 24 odobranie
  1. 21 7
      commons/basic/src/main/ets/utils/arkts/utils/ContextHelper.ets
  2. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/CopyText.ets
  3. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/DebounceLoad.ets
  4. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/DownLoadFileHelper.ets
  5. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/HuaWeiAuthPlugin.ets
  6. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/LazyForeachDeal.ets
  7. 2 2
      commons/basic/src/main/ets/utils/arkts/utils/NoticeUtil.ets
  8. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/PermissionControl.ets
  9. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/RegisterFontUtil.ets
  10. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/ScanCodeUtil.ets
  11. 54 0
      commons/basic/src/main/ets/utils/arkts/utils/WindowHelper.ets
  12. 2 2
      commons/basic/src/main/ets/utils/arkts/utils/YTAvoid.ets
  13. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/YTBindSheet.ets
  14. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/YTBreakPoint.ets
  15. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/YTDate.ets
  16. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/YTDateUtil.ets
  17. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/YTLog.ets
  18. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/YTPhotoHelper.ets
  19. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/YTPreferencesUtil.ets
  20. 1 1
      commons/basic/src/main/ets/utils/arkts/utils/YTRouter.ets
  21. 7 6
      commons/basic/src/main/ets/utils/arkts/utils/YTToast.ets
  22. 0 0
      commons/basic/src/main/ets/utils/arkts/utils/YtOaidUtils.ets
  23. 0 0
      commons/basic/src/main/ets/utils/ts/decorators/RouterPage.ts
  24. 26 0
      commons/basic/src/main/ets/utils/ts/utils/SingleTon.ts
  25. 63 0
      commons/basic/src/main/ets/utils/ts/utils/YTObjectUtils.ts

+ 21 - 7
commons/basic/src/main/ets/utils/ContextHelper.ets → commons/basic/src/main/ets/utils/arkts/utils/ContextHelper.ets

@@ -13,11 +13,24 @@ import {
   yTRouter,
   YTToast,
   YTUserRequest
-} from '../../../../Index'
+} from '../../../../../../Index'
 import { identifier } from '@kit.AdsKit'
 import { BusinessError } from '@kit.BasicServicesKit'
 
 export class ContextHelper {
+  private static _oldContext: Context
+
+  static get oldContext() {
+    if (!ContextHelper._oldContext) {
+      throw new Error('oldContext is not set')
+    }
+    return ContextHelper._oldContext
+  }
+
+  private static set oldContext(value: Context) {
+    ContextHelper._oldContext = value
+  }
+
   private static declare _UIContext: UIContext
 
   static get UIContext() {
@@ -27,7 +40,7 @@ export class ContextHelper {
     return ContextHelper._UIContext
   }
 
-  static set UIContext(value: UIContext) {
+  private static set UIContext(value: UIContext) {
     ContextHelper._UIContext = value
     const context = value.getHostContext()
     if (context && !ContextHelper._context) {
@@ -45,7 +58,7 @@ export class ContextHelper {
     return ContextHelper._UIAbilityContext
   }
 
-  static set UIAbilityContext(value: common.UIAbilityContext) {
+  private static set UIAbilityContext(value: common.UIAbilityContext) {
     ContextHelper._UIAbilityContext = value
     if (!ContextHelper._context) {
       ContextHelper.context = value
@@ -62,7 +75,7 @@ export class ContextHelper {
     return ContextHelper._context
   }
 
-  static set context(value: Context) {
+  private static set context(value: Context) {
     ContextHelper._context = value
   }
 
@@ -72,16 +85,17 @@ export class ContextHelper {
    * @param context 上下文对象
    * @param isOnline 是否为在线app
    */
-  static init(context: UIContext, isOnline: boolean = true) {
+  static init(context: UIContext, oldContext: Context, isOnline: boolean = true) {
     ContextHelper.UIContext = context
+    ContextHelper._oldContext = oldContext
     PersistentStorage.persistProp(AppStorageKeyCollect.IS_STAND_ALONE_APP, isOnline)
-    if(isOnline) {
+    if (isOnline) {
       PersistentStorage.persistProp(AppStorageKeyCollect.TOKEN, '')
       YTUserRequest.refreshUserInfo()
     } else {
       PersistentStorage.persistProp(AppStorageKeyCollect.FIRST_ENTER_APP, false)
       let isFirst = AppStorage.get(AppStorageKeyCollect.FIRST_ENTER_APP)! as boolean
-      if(!isFirst) {
+      if (!isFirst) {
         yTRouter.pushPathByName('EntryPage', null)
       }
     }

+ 0 - 0
commons/basic/src/main/ets/utils/CopyText.ets → commons/basic/src/main/ets/utils/arkts/utils/CopyText.ets


+ 0 - 0
commons/basic/src/main/ets/utils/DebounceLoad.ets → commons/basic/src/main/ets/utils/arkts/utils/DebounceLoad.ets


+ 1 - 1
commons/basic/src/main/ets/utils/DownLoadFileHelper.ets → commons/basic/src/main/ets/utils/arkts/utils/DownLoadFileHelper.ets

@@ -5,7 +5,7 @@ import { fileUri } from '@kit.CoreFileKit';
 import { photoAccessHelper } from '@kit.MediaLibraryKit';
 import { image } from '@kit.ImageKit';
 import { BusinessError, emitter } from '@kit.BasicServicesKit';
-import { YTLog } from '../../../../Index';
+import { YTLog } from '../../../../../../Index';
 
 export class DownLoadFileHelper {
   private cashPaths: string[] = []

+ 1 - 1
commons/basic/src/main/ets/utils/HuaWeiAuthPlugin.ets → commons/basic/src/main/ets/utils/arkts/utils/HuaWeiAuthPlugin.ets

@@ -2,7 +2,7 @@ import { authentication } from '@kit.AccountKit'
 import { util } from '@kit.ArkTS'
 import { hilog } from '@kit.PerformanceAnalysisKit'
 import { BusinessError } from '@kit.BasicServicesKit'
-import { YTLog } from '../../../../Index'
+import { YTLog } from '../../../../../../Index'
 
 export class HuaweiAuthPlugin {
   // 代替了用户输入用户名密码

+ 0 - 0
commons/basic/src/main/ets/utils/LazyForeachDeal.ets → commons/basic/src/main/ets/utils/arkts/utils/LazyForeachDeal.ets


+ 2 - 2
commons/basic/src/main/ets/utils/NoticeUtil.ets → commons/basic/src/main/ets/utils/arkts/utils/NoticeUtil.ets

@@ -1,9 +1,9 @@
 import { common } from '@kit.AbilityKit';
 import { notificationManager } from '@kit.NotificationKit';
 import { BusinessError } from '@kit.BasicServicesKit';
-import { YTLog } from '../../../../Index';
+import { YTLog } from '../../../../../../Index';
 import { pushService } from '@kit.PushKit';
-import { userInfo } from '../models/UserInfo';
+import { userInfo } from '../../../models/UserInfo';
 
 class PushMessageUtil {
   private static instance: PushMessageUtil

+ 0 - 0
commons/basic/src/main/ets/utils/PermissionControl.ets → commons/basic/src/main/ets/utils/arkts/utils/PermissionControl.ets


+ 0 - 0
commons/basic/src/main/ets/utils/RegisterFontUtil.ets → commons/basic/src/main/ets/utils/arkts/utils/RegisterFontUtil.ets


+ 1 - 1
commons/basic/src/main/ets/utils/ScanCodeUtil.ets → commons/basic/src/main/ets/utils/arkts/utils/ScanCodeUtil.ets

@@ -1,7 +1,7 @@
 import { BusinessError } from '@kit.BasicServicesKit';
 import { customScan, scanBarcode, scanCore } from '@kit.ScanKit';
 import { permissionController } from './PermissionControl';
-import { YTLog } from '../../../../Index';
+import { YTLog } from '../../../../../../Index';
 
 interface ScanCodeUtilInterface {
   viewControl: customScan.ViewControl

+ 54 - 0
commons/basic/src/main/ets/utils/arkts/utils/WindowHelper.ets

@@ -0,0 +1,54 @@
+import { window } from '@kit.ArkUI';
+import { AppStorageKeyCollect } from '../../../constants';
+import { singleton } from '../../ts/decorators/Singleton';
+
+import { YTAvoid } from './YTAvoid';
+import { YTBreakPoint } from './YTBreakPoint';
+
+
+@singleton
+class WindowHelper {
+  // 显式声明静态方法,解决类型检查问题
+  static getInstance: () => WindowHelper
+  private declare _windowStage: window.WindowStage
+
+  get windowStage() {
+    if (!this._windowStage) {
+      throw new Error("windowStage尚未赋值")
+    }
+    return this._windowStage
+  }
+
+  init(windowStage: window.WindowStage) {
+    this._windowStage = windowStage;
+    const windowClass = windowStage.getMainWindowSync()
+    windowClass.setWindowLayoutFullScreen(true)
+    const top = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height
+    const bottom = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect.height
+    YTAvoid.setAvoid({
+      top, bottom
+    })
+    windowClass.on('avoidAreaChange', avoidOption => {
+      if (avoidOption.type == window.AvoidAreaType.TYPE_SYSTEM) {
+        YTAvoid.setAvoid({
+          top: avoidOption.area.topRect.height
+        })
+      }
+      if (avoidOption.type == window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) {
+        YTAvoid.setAvoid({
+          bottom: avoidOption.area.bottomRect.height
+        })
+      }
+    })
+    const windowWidth = windowClass.getWindowProperties().windowRect.width
+    const windowHeight = windowClass.getWindowProperties().windowRect.height
+    YTBreakPoint.setBreakPoint(windowWidth, windowHeight)
+    windowClass.on('windowSizeChange', size => {
+      YTBreakPoint.setBreakPoint(size.width, size.height)
+      AppStorage.setOrCreate(AppStorageKeyCollect.SCREEN_WIDTH, px2vp(size.width))
+      AppStorage.setOrCreate(AppStorageKeyCollect.SCREEN_HEIGHT, px2vp(size.height))
+    })
+  }
+}
+
+export const windowHelper: WindowHelper = WindowHelper.getInstance();

+ 2 - 2
commons/basic/src/main/ets/utils/YTAvoid.ets → commons/basic/src/main/ets/utils/arkts/utils/YTAvoid.ets

@@ -1,6 +1,6 @@
 import { window } from '@kit.ArkUI'
-import { AvoidType } from '../models'
-import { YTLog } from '../../../../Index'
+import { AvoidType } from '../../../models'
+import { YTLog } from '../../../../../../Index'
 
 export class YTAvoid {
   /**

+ 1 - 1
commons/basic/src/main/ets/utils/YTBindSheet.ets → commons/basic/src/main/ets/utils/arkts/utils/YTBindSheet.ets

@@ -1,4 +1,4 @@
-import { BasicType } from '../models';
+import { BasicType } from '../../../models';
 import { ComponentContent } from '@kit.ArkUI';
 import { Params } from './YTToast';
 import { BusinessError } from '@ohos.base';

+ 1 - 1
commons/basic/src/main/ets/utils/YTBreakPoint.ets → commons/basic/src/main/ets/utils/arkts/utils/YTBreakPoint.ets

@@ -1,4 +1,4 @@
-import { BreakPointString } from '../models'
+import { BreakPointString } from '../../../models'
 
 interface BreakPointTypeOption<T> {
   xs?: T

+ 0 - 0
commons/basic/src/main/ets/utils/YTDate.ets → commons/basic/src/main/ets/utils/arkts/utils/YTDate.ets


+ 0 - 0
commons/basic/src/main/ets/utils/YTDateUtil.ets → commons/basic/src/main/ets/utils/arkts/utils/YTDateUtil.ets


+ 0 - 0
commons/basic/src/main/ets/utils/YTLog.ets → commons/basic/src/main/ets/utils/arkts/utils/YTLog.ets


+ 1 - 1
commons/basic/src/main/ets/utils/YTPhotoHelper.ets → commons/basic/src/main/ets/utils/arkts/utils/YTPhotoHelper.ets

@@ -5,7 +5,7 @@ import { util } from '@kit.ArkTS';
 import { photoAccessHelper } from '@kit.MediaLibraryKit';
 import { image } from '@kit.ImageKit';
 import { BusinessError } from '@kit.BasicServicesKit';
-import { ContextHelper, ResultCallBack, YTLog } from '../../../../Index';
+import { ContextHelper, ResultCallBack, YTLog } from '../../../../../../Index';
 import { componentSnapshot } from '@kit.ArkUI';
 import fs from '@ohos.file.fs';
 

+ 0 - 0
commons/basic/src/main/ets/utils/YTPreferencesUtil.ets → commons/basic/src/main/ets/utils/arkts/utils/YTPreferencesUtil.ets


+ 1 - 1
commons/basic/src/main/ets/utils/YTRouter.ets → commons/basic/src/main/ets/utils/arkts/utils/YTRouter.ets

@@ -1,5 +1,5 @@
 import { IBestToast } from '@ibestservices/ibest-ui'
-import { DelPhotoParam } from '../models'
+import { DelPhotoParam } from '../../../models'
 
 class YTRouter extends NavPathStack {
   private static declare instance: YTRouter

+ 7 - 6
commons/basic/src/main/ets/utils/YTToast.ets → commons/basic/src/main/ets/utils/arkts/utils/YTToast.ets

@@ -1,12 +1,12 @@
 import { BusinessError } from '@kit.BasicServicesKit';
 import { ComponentContent, promptAction } from '@kit.ArkUI';
 import { UIContext } from '@ohos.arkui.UIContext';
-import { BasicType, ContextHelper, YTLog } from '../../../../Index';
-import { yTDoubleConfirm } from '../components/ToastBuilders/YtDoubleConfirm';
-import { agreePrivacy } from '../components/ToastBuilders/AgreePrivacy';
-import { LoginCollect } from '../models/LoginCollect';
-import { loginToUse } from '../components/ToastBuilders/LoginToUse';
-import { AlertToastBuilder } from '../components/ToastBuilders/AlertToastComp';
+import { BasicType, ContextHelper, YTLog } from '../../../../../../Index';
+import { yTDoubleConfirm } from '../../../components/toastBuilders/YtDoubleConfirm';
+import { agreePrivacy } from '../../../components/toastBuilders/AgreePrivacy';
+import { LoginCollect } from '../../../models/LoginCollect';
+import { loginToUse } from '../../../components/toastBuilders/LoginToUse';
+import { AlertToastBuilder } from '../../../components/toastBuilders/AlertToastComp';
 
 interface InitOption {
   context?: UIContext;
@@ -114,6 +114,7 @@ export class YTToast {
   loginToUse(item: BasicType = {}) {
     this.openToast(wrapBuilder(loginToUse), item)
   }
+
   alertToast(item: BasicType<undefined>) {
     this.openToast(wrapBuilder(AlertToastBuilder), item)
   }

+ 0 - 0
commons/basic/src/main/ets/utils/YtOaidUtils.ets → commons/basic/src/main/ets/utils/arkts/utils/YtOaidUtils.ets


+ 0 - 0
commons/basic/src/main/ets/ts/index.ts → commons/basic/src/main/ets/utils/ts/decorators/RouterPage.ts


+ 26 - 0
commons/basic/src/main/ets/utils/ts/utils/SingleTon.ts

@@ -0,0 +1,26 @@
+//单例基类 所有这个类的子类均为单例且获取实例有且只能通过getInstance方法
+export abstract class Singleton {
+  private static instances: Map<Function, any> = new Map();
+  private static creatingInstance: boolean = false;
+
+  constructor() {
+    if (new.target == Singleton) {
+      throw new Error('SingletonBase cannot be instantiated directly');
+    }
+    if (!Singleton.creatingInstance) {
+      throw new Error('This class is a singleton and can only be instantiated through getInstance()');
+    }
+  }
+
+  static getInstance<T>(this: new (...args: any[]) => T): T {
+    if (!Singleton.instances.has(this)) {
+      Singleton.creatingInstance = true;
+      try {
+        Singleton.instances.set(this, new this());
+      } finally {
+        Singleton.creatingInstance = false;
+      }
+    }
+    return Singleton.instances.get(this);
+  }
+}

+ 63 - 0
commons/basic/src/main/ets/utils/ts/utils/YTObjectUtils.ts

@@ -0,0 +1,63 @@
+//试用版 有问题再改(●'◡'●)
+export class YTObjectUtils {
+  //对Object.keys的再封装 使其可以在ets中使用
+  static getObjectKeys(instance: object) {
+    return Object.keys(instance)
+  }
+
+  //对Object.values的再封装 使其可以在ets中使用
+  static getObjectValues(instance: object) {
+    return Object.values(instance)
+  }
+
+  //适用于ets类型对中括号语法被限制时使用,获取到KEY对应的value值
+  static getKeyMapValue<T>(target: object, key: string): T {
+    return target[key]
+  }
+
+  //批量赋值 在赋值被装饰器修饰的对象时需要使用返回值对其进行重新赋值
+  static mapPropertyIfExist<T extends object>(target: T, value: T) {
+    Object.keys(value).forEach(key => {
+      if (value[key] !== undefined) {
+        target[key] = value[key]
+      }
+    })
+
+    return YTObjectUtils.deepClone(target)
+  }
+
+  //不丢失方法的深拷贝 类型过于庞大复杂或批量调用此方法会存在性能问题
+  static deepClone<T extends object>(instance: T): T {
+    if (instance === null || typeof instance !== 'object') {
+      return instance;
+    }
+
+    if (instance instanceof Date) {
+      return new Date(instance.getTime()) as any;
+    }
+
+    if (instance instanceof Array) {
+      const clonedArray = [] as any[];
+      instance.forEach((item, index) => {
+        clonedArray[index] = YTObjectUtils.deepClone(item);
+      });
+      return clonedArray as T;
+    }
+
+    if (typeof instance === 'object') {
+      const clonedObj = {} as T;
+      Object.keys(instance).forEach(key => {
+        clonedObj[key] = YTObjectUtils.deepClone(instance[key]);
+      });
+      return clonedObj;
+    }
+
+    return instance;
+  }
+
+  //通过构造函数从外部直接实例化类 与ArkTs装饰器混用时可能会出现问题 建议避免
+  static newInstance<T extends object>(constructor: new (...args: any[]) => T, ...args: any[]): T {
+    return new constructor(...args);
+  }
+}
+