diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/mutableStateMeta.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/mutableStateMeta.ts index c75ff8148944fcadab1b6d5f12f452749fedca03..cbd9038672ef8990671eade20ce6aebc8bfe2a20 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/mutableStateMeta.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/mutableStateMeta.ts @@ -14,12 +14,12 @@ */ import { int32 } from '@koalaui/common'; -import { MutableState, mutableState, GlobalStateManager } from '@koalaui/runtime'; +import { MutableState } from '@koalaui/runtime'; import { IMutableStateMeta, IMutableKeyedStateMeta } from '../decorator'; import { RenderIdType } from '../decorator'; import { ObserveSingleton } from './observeSingleton'; import { StateMgmtConsole } from '../tools/stateMgmtDFX'; - +import { StateMgmtTool } from '#stateMgmtTool'; class MutableStateMetaBase { public readonly info_: string; @@ -45,7 +45,7 @@ export class MutableStateMeta extends MutableStateMetaBase implements IMutableSt constructor(info: string, metaDependency?: MutableState) { super(info); - this.__metaDependency = metaDependency ?? mutableState(0); + this.__metaDependency = metaDependency ?? StateMgmtTool.getGlobalStateManager().mutableState(0, true); } public addRef(): void { @@ -79,7 +79,10 @@ export class MutableKeyedStateMeta extends MutableStateMetaBase implements IMuta let metaDependency: MutableStateMeta | undefined = this.__metaDependencies.get(key); if (!metaDependency) { // incremental engine does not allow create mutableState while building tree - metaDependency = new MutableStateMeta(key, GlobalStateManager.instance.mutableState(0, true)); + metaDependency = new MutableStateMeta( + key, + StateMgmtTool.getGlobalStateManager().mutableState(0, true) + ); this.__metaDependencies.set(key, metaDependency); } metaDependency.addRef(); diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeSingleton.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeSingleton.ts index c9cea58175b51bea742c1310055cef38c2086b4c..ac7d4e04d5791adb1f57e77a616489af4e3ce87b 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeSingleton.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeSingleton.ts @@ -19,7 +19,7 @@ import { IBindingSource } from './mutableStateMeta'; import { TypeChecker } from '#components'; import { StateMgmtTool } from '#stateMgmtTool'; import { NullableObject } from './types'; -import { GlobalStateManager } from '@koalaui/runtime'; +import { StateManagerImpl } from '@koalaui/runtime'; import { StateMgmtConsole } from '../tools/stateMgmtDFX'; export class ObserveSingleton implements IObserve { @@ -39,7 +39,8 @@ export class ObserveSingleton implements IObserve { } get renderingId(): RenderIdType | undefined { - const id = GlobalStateManager.getCurrentScopeId() ?? ObserveSingleton.InvalidRenderId; + const id = + (StateMgmtTool.getGlobalStateManager() as StateManagerImpl).current?.id ?? ObserveSingleton.InvalidRenderId; return id; } set renderingId(value: RenderIdType | undefined) { diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedArray.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedArray.ts index d2156be1df56f4f5a96429b01f6d566d794a0d28..e49f6ed5733c063238f9b8124cb0e0f121559824 100755 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedArray.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedArray.ts @@ -18,7 +18,7 @@ import { SubscribedWatches } from '../decoratorImpl/decoratorWatch'; import { ObserveSingleton } from './observeSingleton'; import { FactoryInternal } from './iFactoryInternal'; import { ObserveWrappedBase } from './observeWrappedBase'; - +import { UIUtils } from '../utils'; final class CONSTANT { public static readonly OB_ARRAY_ANY_KEY = '__OB_ANY_INDEX'; public static readonly OB_LENGTH = '__OB_LENGTH'; @@ -103,7 +103,7 @@ export class WrappedArray extends Array implements IObservedObject, Observ this.meta_.addRef(CONSTANT.OB_LENGTH); this.meta_.addRef(String(idx as Object | undefined | null)); } - return this.store_[idx]; + return UIUtils.makeObserved(this.store_[idx]); } // [] operator diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedMap.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedMap.ts index 9b544d3dc76bdacc4f9260fac38f5609dac71f91..182edc43d3d23a06b751f40ad6857842d9eb6f1e 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedMap.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/observeWrappedMap.ts @@ -18,7 +18,7 @@ import { SubscribedWatches } from '../decoratorImpl/decoratorWatch'; import { FactoryInternal } from './iFactoryInternal'; import { ObserveSingleton } from './observeSingleton'; import { ObserveWrappedBase } from './observeWrappedBase'; - +import { UIUtils } from '../utils'; final class CONSTANT { public static readonly OB_MAP_ANY_PROPERTY = '__OB_SET_ANY_PROPERTY'; public static readonly OB_LENGTH = '__OB_LENGTH'; @@ -167,7 +167,7 @@ export class WrappedMap extends Map implements IObservedObject, Obse this.meta_.addRef(CONSTANT.OB_LENGTH); } } - return this.store_.get(key); + return UIUtils.makeObserved(this.store_.get(key)); } /** diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/uiUtilsImpl.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/uiUtilsImpl.ts index 38ef431824ad3610b3c2ae6ab51e5ce8feb6644a..741b2ffb847da75281ebdd0501a92ec11878582e 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/uiUtilsImpl.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/base/uiUtilsImpl.ts @@ -86,19 +86,19 @@ export class UIUtilsImpl { } public makeObserved(value: T): T { - if (StateMgmtTool.isIObservedObject(value as NullableObject)) { + if (value instanceof ObserveWrappedBase) { return value as T; } - if (value instanceof Array) { + if (value instanceof Array && Type.of(value).getName() === 'escompat.Array') { return UIUtilsImpl.makeObservedArray(value) as T; } - if (value instanceof Date) { + if (value instanceof Date && Type.of(value).getName() === 'escompat.Date') { return UIUtilsImpl.makeObservedDate(value) as T; } - if (value instanceof Map) { + if (value instanceof Map && Type.of(value).getName() === 'escompat.Map') { return UIUtilsImpl.makeObservedMap(value) as T; } - if (value instanceof Set) { + if (value instanceof Set && Type.of(value).getName() === 'escompat.Set') { return UIUtilsImpl.makeObservedSet(value) as T; } if (value && StateMgmtTool.isObjectLiteral(value)) { diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/observeInterfaceProxy.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/observeInterfaceProxy.ts index 61b18ae4f86ee9ed34962aaf71fa5af4f2dedf35..06ebca17d075390ae682b936ec29d7ffa7c729b2 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/observeInterfaceProxy.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/observeInterfaceProxy.ts @@ -20,6 +20,7 @@ import { IMutableStateMeta } from '../../decorator'; import { STATE_MGMT_FACTORY } from '../../decorator'; import { OBSERVE } from '../../decorator'; import { NullableObject } from '../../base/types'; +import { UIUtils } from '../../utils'; export class InterfaceProxyHandler implements ProxyHandler, IObservedObject, ISubscribedWatches { private readonly __meta: IMutableStateMeta = STATE_MGMT_FACTORY.makeMutableStateMeta(); @@ -48,7 +49,7 @@ export class InterfaceProxyHandler implements ProxyHandler, if (typeof value !== 'function' && this.shouldAddRef()) { this.__meta.addRef(); } - return value; + return UIUtils.makeObserved(value); } public set(target: T, name: string, newValue: Any): boolean { if (Reflect.get(target, name) !== newValue) { diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/stateMgmtTool.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/stateMgmtTool.ts index 80d8ff7eb145780276e0af2581f14aaf84f0f0ab..c7793fb7adebd4d2435e01f28345975f2e91e1f3 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/stateMgmtTool.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/tools/arkts/stateMgmtTool.ts @@ -28,6 +28,10 @@ import { NullableObject } from '../../base/types'; import { InterfaceProxyHandler } from './observeInterfaceProxy'; import { ISubscribedWatches } from '../../decorator'; import { DecoratedV1VariableBase } from '../../decoratorImpl/decoratorBase'; +import { StateManager, GlobalStateManager } from '@koalaui/runtime'; +import { UIContextUtil } from '../../../handwritten/UIContextUtil'; +import { UIContextImpl } from '../../../handwritten/UIContextImpl'; +import { StateMgmtConsole } from '../stateMgmtDFX'; export class StateMgmtTool { static isIObservedObject(value: NullableObject): boolean { return value instanceof IObservedObject; @@ -77,4 +81,17 @@ export class StateMgmtTool { static isObjectLiteral(value: T): boolean { return Reflect.isLiteralInitializedInterface(value); } + static getGlobalStateManager(): StateManager { + return GlobalStateManager.instance; + } + static tryGetCurrentGlobalStateManager(): StateManager { + let context: UIContextImpl | undefined = undefined; + try { + context = UIContextUtil.getOrCreateCurrentUIContext() as UIContextImpl; + } catch (e) { + // for scenario where UIContext is not ready. + StateMgmtConsole.log('Get current UIContext fail, will directly use GlobalStateManager'); + } + return context && context.stateMgr ? context.stateMgr! : GlobalStateManager.instance; + } } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/index.ts b/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/index.ts index bd83b34294907004f245004b1331ee299850a8dc..286db96c35e28def9f0c88c8791943c25c093d9b 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/index.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/index.ts @@ -146,6 +146,7 @@ export { StateManager, ValueTracker, createStateManager, + StateManagerImpl } from "./states/State" export { __context,