diff --git a/adapter/ohos/entrance/ace_container_hybrid_impl.cpp b/adapter/ohos/entrance/ace_container_hybrid_impl.cpp index bd98860f2a88fb66acccd52f4c61040254757b2a..fea3cb9119d8ae6a5a922ed2448707ad1a1d8b33 100644 --- a/adapter/ohos/entrance/ace_container_hybrid_impl.cpp +++ b/adapter/ohos/entrance/ace_container_hybrid_impl.cpp @@ -63,6 +63,9 @@ void AceContainer::InitializeStaticHybridDynamic(std::shared_ptr(sharedRuntime_); + // open statemanagement interop + DynamicCast(frontend_)->OpenStateMgmtInterop(); + // 1.1 initialization #ifdef NG_BUILD subFrontend_ = AceType::MakeRefPtr(); diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp index 4e41f1bfb38e787fd0f5688738114f4a262ac259..2412e70a0c45f6f6135d52c3e1dd964ed973ef27 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.cpp +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.cpp @@ -473,6 +473,34 @@ void ArktsFrontend::PreloadAceModule(void* aniEnv) ArktsFrontend::preloadArkTSRuntime = aniEnv; } +void ArktsFrontend::OpenStateMgmtInterop() +{ + auto* env = ArktsAniUtils::GetAniEnv(vm_); + CHECK_NULL_VOID(env); + + ani_status state; + + static const char* moduleName = "Larkui/component/interop;"; + ani_module interopModule; + state = env->FindModule(moduleName, &interopModule); + if (state != ANI_OK) { + LOGE("Cannot find module arkui.component.interop %{public}d", state); + return; + } + + ani_function fn; + state = env->Module_FindFunction(interopModule, "openInterop", ":V", &fn); + if (state != ANI_OK) { + LOGE("Cannot find function openInterop in module %{public}d", state); + } + + state = env->Function_Call_Void(fn); + if (state != ANI_OK) { + LOGE("Function_Call openInterop failed %{public}d", state); + } + return; +} + extern "C" ACE_FORCE_EXPORT void OHOS_ACE_PreloadAceArkTSModule(void* aniEnv) { ArktsFrontend::PreloadAceModule(aniEnv); diff --git a/frameworks/bridge/arkts_frontend/arkts_frontend.h b/frameworks/bridge/arkts_frontend/arkts_frontend.h index 3530d5097d9a1004b4cb04e93354588b6a968280..a6eae3720860793ce859b5b95dbdc325dd6450cd 100644 --- a/frameworks/bridge/arkts_frontend/arkts_frontend.h +++ b/frameworks/bridge/arkts_frontend/arkts_frontend.h @@ -369,6 +369,8 @@ public: static void PreloadAceModule(void* aniEnv); static void* preloadArkTSRuntime; + + void OpenStateMgmtInterop(); private: RefPtr taskExecutor_; RefPtr pipeline_; diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/interop.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/interop.ts index cf4c2f0cfd436f5628a2f5058d4308fe79f6ce95..3470f9c454d20d7d0126e847e099c5ea20f2240d 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/interop.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/interop.ts @@ -15,9 +15,9 @@ import { ArkUIAniModule } from "arkui.ani" import { KPointer } from '@koalaui/interop'; -import { PeerNode } from '../PeerNode'; +import { PeerNode, findPeerNode } from '../PeerNode'; import { int32 } from '@koalaui/common'; -import { NodeAttach } from '@koalaui/runtime'; +import { __context, __id, GlobalStateManager, IncrementalNode, memoEntry, NodeAttach, StateContext } from '@koalaui/runtime'; import { ExtendableComponent } from './extendableComponent'; import { StateDecoratedVariable, @@ -27,9 +27,13 @@ import { ConsumeDecoratedVariable, WatchFunc, UIUtils, - IObservedObject + IObservedObject, + OBSERVE, + ObserveSingleton } from '../stateManagement'; import { IDecoratedV1Variable, WatchFuncType, WatchIdType } from '../stateManagement/decorator'; +import { UIContextUtil } from "arkui/handwritten/UIContextUtil"; +import { DetachedRootEntryImpl, UIContextImpl } from "arkui/handwritten/UIContextImpl"; export class CompatiblePeerNode extends PeerNode { protected constructor(peerPtr: KPointer, id: int32, view: ESValue, name: string = '', flags: int32 = 0) { @@ -54,39 +58,49 @@ export interface CompatibleComponentInfo { export function compatibleComponent( init: () => CompatibleComponentInfo, update: (instance: ESValue) => void, - component?: ExtendableComponent, + staticComponent?: ExtendableComponent ): void { NodeAttach((): CompatiblePeerNode => { let global = ESValue.getGlobal(); const ptr = ArkUIAniModule._CreateViewStackProcessor(); - openInterop(global); - if (component !== undefined) { - bindCompatibleLocalStorageCallback(component!); + if (staticComponent !== undefined) { + bindCompatibleProvideCallback(staticComponent!); + bindCompatibleLocalStorageCallback(staticComponent!); } const result = init(); - const realComponent = result.component; - if (component !== undefined && realComponent !== undefined) { - bindCompatibleLocalStorageCallback(component!, realComponent!); + const dynamicComponent = result.component; + if (staticComponent !== undefined) { + if (dynamicComponent !== undefined) { + bindCompatibleProvideCallback(staticComponent!, dynamicComponent!); + bindCompatibleLocalStorageCallback(staticComponent!, dynamicComponent!); + } + let resetViewPUFindProvideInterop = global.getProperty("resetViewPUFindProvideInterop"); + resetViewPUFindProvideInterop.invoke(); let resetViewPUInterop = global.getProperty('resetViewPUFindLocalStorageInterop'); resetViewPUInterop.invoke(); } const nodePtr = ArkUIAniModule._PopViewStackProcessor(); ArkUIAniModule._DeleteViewStackProcessor(ptr); - return CompatiblePeerNode.create(nodePtr, realComponent); + return CompatiblePeerNode.create(nodePtr, dynamicComponent); }, (node: CompatiblePeerNode) => { update(node.view); }); } -function openInterop(global: ESValue): void { +function openInterop(): void { + let global = ESValue.getGlobal(); + if (!global) { + throw Error("cannot find ArkTS1.1 global."); + } let openInterop = global.getProperty('openInterop'); openInterop.invoke(); registerCreateWatchFuncCallback(); registerCreateStaticObservedCallback(); } -function closeInterop(global: ESValue): void { +function closeInterop(): void { + let global = ESValue.getGlobal(); let closeInterop = global.getProperty('closeInterop'); closeInterop.invoke(); } @@ -96,8 +110,10 @@ export type CompatibleStateChangeCallback = (value: T) => void; type StateUnion = StateDecoratedVariable | ProvideDecoratedVariable | PropDecoratedVariable -export function bindCompatibleProvideCallback(staticComponent: ExtendableComponent, - createState: ESValue, setCallback: ESValue, component?: ESValue): void { +export function bindCompatibleProvideCallback(staticComponent: ExtendableComponent, component?: ESValue): void { + let global = ESValue.getGlobal(); + let createState = global.getProperty('createStateVariable'); + let setFindProvideInterop = global.getProperty('setFindProvideInterop'); const callback = (providedPropName: string): Object | null => { let provide = staticComponent.findProvide(providedPropName); if ((provide === null)) { @@ -114,17 +130,14 @@ export function bindCompatibleProvideCallback(staticComponent: ExtendableCompone proxy.invokeMethod('set', ESValue.wrap(value)); }); state.setProxyValue = setProxy; - let notifyCallback = ((propertyName: string) => { - proxy.invokeMethod('notifyPropertyHasChangedPU'); - }); - state.setNotifyCallback(notifyCallback); } return state.getProxy()!.unwrap()! as Object; } - setCallback.invoke(callback, component); + setFindProvideInterop.invoke(callback, component); return; } + export function bindCompatibleLocalStorageCallback(staticComponent: ExtendableComponent, component?: ESValue): void { const callback = (): Object | null => { @@ -141,7 +154,9 @@ export function bindCompatibleLocalStorageCallback(staticComponent: ExtendableCo } -export function getCompatibleState(staticState: IDecoratedV1Variable, createState: ESValue): ESValue { +export function getCompatibleState(staticState: IDecoratedV1Variable): ESValue { + let global = ESValue.getGlobal(); + let createState = global.getProperty('createStateVariable'); let source = staticState; let isLink = staticState instanceof LinkDecoratedVariable; @@ -169,10 +184,6 @@ export function getCompatibleState(staticState: IDecoratedV1Variable, crea proxy.invokeMethod('set', ESValue.wrap(value)); }); state.setProxyValue = setProxyValue; - let notifyCallback = ((propertyName: string) => { - proxy.invokeMethod('notifyPropertyHasChangedPU'); - }); - state.setNotifyCallback(notifyCallback); } return state.getProxy()!; } else if (isProvide) { @@ -187,10 +198,6 @@ export function getCompatibleState(staticState: IDecoratedV1Variable, crea proxy.invokeMethod('set', ESValue.wrap(value)); }); state.setProxyValue = setProxyValue; - let notifyCallback = ((propertyName: string) => { - proxy.invokeMethod('notifyPropertyHasChangedPU'); - }); - state.setNotifyCallback(notifyCallback); } return state.getProxy()!; } else if (isProp) { @@ -205,10 +212,6 @@ export function getCompatibleState(staticState: IDecoratedV1Variable, crea proxy.invokeMethod('set', ESValue.wrap(value)); }); state.setProxyValue = setProxyValue; - let notifyCallback = ((propertyName: string) => { - proxy.invokeMethod('notifyPropertyHasChangedPU'); - }); - state.setNotifyCallback(notifyCallback); } return state.getProxy()!; } @@ -216,6 +219,9 @@ export function getCompatibleState(staticState: IDecoratedV1Variable, crea } export function isDynamicObject(value: T): boolean { + if (value instanceof ESValue) { + return false; + } return ESValue.wrap(value).isECMAObject(); } @@ -344,4 +350,45 @@ export function compatibleWrappedBuilder(builder: Any, ...args: FixedArray( + /** @memo */ + builder: T +): ESValue { + const staticBuilderFunc = (...params: FixedArray): number => { + /** @memo */ + const func = () => { + builder.unsafeCall(...[__context(), __id(), ...params]); + }; + + let uiContext = UIContextUtil.getOrCreateCurrentUIContext() as UIContextImpl; + let manager = uiContext.stateMgr; + if (manager === undefined) { + manager = GlobalStateManager.instance; + } + const node = manager.updatableNode(new IncrementalNode(), (context: StateContext) => { + const frozen = manager.frozen; + manager.frozen = true; + ArkUIAniModule._Common_Sync_InstanceId(uiContext.getInstanceId()); + let r = OBSERVE.renderingComponent; + OBSERVE.renderingComponent = ObserveSingleton.RenderingComponentV1; + memoEntry(context, 0, func); + OBSERVE.renderingComponent = r; + ArkUIAniModule._Common_Restore_InstanceId(); + manager.frozen = frozen; + }); + + const inc = node.value; + const peerNode = findPeerNode(inc); + if (peerNode === undefined) { + node.dispose(); + return 0; + } + uiContext.getDetachedRootEntryManager().detachedRoots_.set(peerNode.peer.ptr, new DetachedRootEntryImpl(node)); + return peerNode.getPeerPtr() as number; + } + let createDynamicBuilder = ESValue.getGlobal().getProperty('createDynamicBuilder'); + let dynamicBuilder = createDynamicBuilder.invoke(ESValue.wrap(staticBuilderFunc)); + return dynamicBuilder; } \ No newline at end of file diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProp.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProp.ts index 06ea0e8553f0d73790d367b3d9ad126c4a0fc671..bfaeb0c0ebd249f08568b535c9c57ec72aa0a40b 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProp.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProp.ts @@ -92,7 +92,7 @@ export class PropDecoratedVariable extends DecoratedV1VariableBase impleme if (isDynamicObject(newValue)) { newValue = getObservedObject(newValue, this); } - if (typeof this.setProxyValue === 'function') { + if (this.setProxyValue) { this.setProxyValue!(newValue); } // @Watch @@ -148,15 +148,6 @@ export class PropDecoratedVariable extends DecoratedV1VariableBase impleme public setProxyValue?: CompatibleStateChangeCallback; - public setNotifyCallback(callback: WatchFuncType): void { - const func = new WatchFunc(callback); - const id = func.id(); - const value = this.__localValue.get(false); - if (StateMgmtTool.isIObservedObject(value as NullableObject)) { - (value as IObservedObject).addWatchSubscriber(id); - } - } - public fireChange(): void { this.__localValue.fireChange(); } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProvide.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProvide.ts index ca613f4c2194dcfa974717eac7945bdf6c393abd..199823dd2081920866b0184b5eb3fa74a5475fae 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProvide.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorProvide.ts @@ -65,7 +65,7 @@ export class ProvideDecoratedVariable extends DecoratedV1VariableBase impl if (isDynamicObject(newValue)) { newValue = getObservedObject(newValue, this); } - if (typeof this.setProxyValue === 'function') { + if (this.setProxyValue) { this.setProxyValue!(newValue); } const value = UIUtils.makeObserved(newValue); @@ -88,15 +88,6 @@ export class ProvideDecoratedVariable extends DecoratedV1VariableBase impl public setProxyValue?: CompatibleStateChangeCallback; - public setNotifyCallback(callback: WatchFuncType): void { - const func = new WatchFunc(callback); - const id = func.id(); - const value = this.backing_.get(false); - if (StateMgmtTool.isIObservedObject(value as NullableObject)) { - (value as IObservedObject).addWatchSubscriber(id); - } - } - public fireChange(): void { this.backing_.fireChange(); } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorState.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorState.ts index 29fdc962426465d3df5fbf38e2b801eaaf0d03d1..d166de2fa03423844285e4d48abb34ec689bbf42 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorState.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/stateManagement/decoratorImpl/decoratorState.ts @@ -73,7 +73,7 @@ export class StateDecoratedVariable extends DecoratedV1VariableBase implem if (isDynamicObject(newValue)) { newValue = getObservedObject(newValue, this); } - if (typeof this.setProxyValue === 'function') { + if (this.setProxyValue) { this.setProxyValue!(newValue); } const value = UIUtils.makeObserved(newValue); @@ -143,15 +143,6 @@ export class StateDecoratedVariable extends DecoratedV1VariableBase implem public setProxyValue?: CompatibleStateChangeCallback; - public setNotifyCallback(callback: WatchFuncType): void { - const func = new WatchFunc(callback); - const id = func.id(); - const value = this.backing_.get(false); - if (StateMgmtTool.isIObservedObject(value as NullableObject)) { - (value as IObservedObject).addWatchSubscriber(id); - } - } - public fireChange(): void { this.backing_.fireChange(); } diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp index 0eaf98e1fa12221c8dd00e63de58d712bc1f23ec..a882ab2f85c2515754fe4065f5968c37577ef33b 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.cpp @@ -89,6 +89,8 @@ void JSViewStackProcessor::JSBind(BindingTarget globalObj) &JSViewStackProcessor::JsPushPrebuildCompCmd, opt); JSClass::StaticMethod("CheckIsPrebuildTimeout", &JSViewStackProcessor::JsCheckIsPrebuildTimeout, opt); + JSClass::StaticMethod("push", &JSViewStackProcessor::JsPush, opt); + JSClass::StaticMethod("pop", &JSViewStackProcessor::JsPop, opt); JSClass::Bind<>(globalObj); } @@ -221,4 +223,21 @@ bool JSViewStackProcessor::JsCheckIsPrebuildTimeout() { return ViewStackModel::GetInstance()->CheckIsPrebuildTimeout(); } + +void JSViewStackProcessor::JsPush(cosnt JSCallbackInfo &info) +{ + if (info.Length < 1) { + return; + } + if (!info[0]->IsNumber()) { + return; + } + + return ViewStackModel::GetInstance()->PushPtr(info[0]->ToNumber()); +} + +void JSViewStackProcessor::JsPop() +{ + return ViewStackModel::GetInstance()->Pop(); +} } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h index 12af23778f50f4c6fdb11f7e9a9b06ddcc3938a7..deffdbe5ddf720da13ad8e5ce8a8f1bc24922527 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_stack_processor.h @@ -103,6 +103,10 @@ public: */ static void JsSendStateInfo(const std::string& stateInfo); + static void JsPush(const JSCallbackInfo& info); + + static void JsPop(); + static void JsPushPrebuildCompCmd(const JSCallbackInfo& info); static bool JsCheckIsPrebuildTimeout(); diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop.ts index b36783324060dd049d478f1f2d9f90e2e4223282..85b3d37e6a456ddcdd55c6d98efa0276d2439ef7 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/interop/interop.ts @@ -116,4 +116,24 @@ function registerCallbackForCreateWatchID(callback: () => any) { function registerCallbackForMakeObserved(callback: (value: Object) => Object) { InteropExtractorModule.makeObserved = callback; +} + +/** + * + * @param staticBuilder ArkTS1.2builder, return the pointer of PeerNode + * @returns Creates a dynamic builder function that wraps a static builder + */ +function createDynamicBuilder( + staticBuilder: (...args: any[]) => number +): (...args: any[]) => void { + let func = function (...args: any[]): void { + this.observeComponentCreation2((elmtId: number, isInitialRender: boolean) => { + if (isInitialRender) { + let pointer = staticBuilder(...args); + ViewStackProcessor.push(pointer); + } + }, {}); + ViewStackProcessor.pop(); + }; + return func; } \ No newline at end of file diff --git a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_viewstack_processor.d.ts b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_viewstack_processor.d.ts index fc84e73af670a9d71dea0a417ac4d7aef5d2a63c..76f9f1a705630450227e4fe5c10ee216b0fe79b4 100644 --- a/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_viewstack_processor.d.ts +++ b/frameworks/bridge/declarative_frontend/state_mgmt/src/lib/puv2_common/puv2_viewstack_processor.d.ts @@ -93,4 +93,8 @@ declare class ViewStackProcessor { public static PushPrebuildCompCmd(): void; public static CheckIsPrebuildTimeout(): boolean; + + public static push(pointer: number): void; + + public static pop(): void; } \ No newline at end of file diff --git a/frameworks/core/components_ng/base/view_stack_model.h b/frameworks/core/components_ng/base/view_stack_model.h index 09658af4ccf3310420833345265f10101a4ff881..bf92a68f41e3031a25d8aab97a6907a2708485df 100644 --- a/frameworks/core/components_ng/base/view_stack_model.h +++ b/frameworks/core/components_ng/base/view_stack_model.h @@ -35,6 +35,7 @@ public: virtual ~ViewStackModel() = default; virtual void Push(const RefPtr& node, bool isCustomView) = 0; + virtual void PushPtr(int64_t ptr) {}; virtual void Pop() = 0; virtual void PopContainer() = 0; virtual void PushKey(const std::string& key) = 0; diff --git a/frameworks/core/components_ng/base/view_stack_model_ng.h b/frameworks/core/components_ng/base/view_stack_model_ng.h index 7ee53e14ea450176f4194efb0d60d414b00554a9..addffe14b6cba6a6ea157d7f06747240535c0fe3 100644 --- a/frameworks/core/components_ng/base/view_stack_model_ng.h +++ b/frameworks/core/components_ng/base/view_stack_model_ng.h @@ -34,6 +34,11 @@ public: ViewStackProcessor::GetInstance()->Push(uiNode, isCustomView); } + void PushPtr(int64_t pointer) override + { + ViewStackProcessor::GetInstance()->PushPtr(pointer); + } + void Pop() override { ViewStackProcessor::GetInstance()->Pop(); diff --git a/frameworks/core/components_ng/base/view_stack_processor.cpp b/frameworks/core/components_ng/base/view_stack_processor.cpp index 7b678dada48d6b6c3770e8e19e4b851e71257065..c5978210fd2fa5d926fd2a5981bbe38e9475d61b 100644 --- a/frameworks/core/components_ng/base/view_stack_processor.cpp +++ b/frameworks/core/components_ng/base/view_stack_processor.cpp @@ -77,6 +77,14 @@ void ViewStackProcessor::Push(const RefPtr& element, bool /*isCustomView elementsStack_.push(element); } +void ViewStackProcessor::PushPtr(int64_t elementPtr) +{ + if (elementPtr == 0) { + return; + } + Push(UINode::Claim(reinterpret_cast(elementPtr)), true); +} + bool ViewStackProcessor::ShouldPopImmediately() { if (elementsStack_.size() <= 1) { diff --git a/frameworks/core/components_ng/base/view_stack_processor.h b/frameworks/core/components_ng/base/view_stack_processor.h index 1bd8d7493bd3412e736da1f6a3fea1f42930590e..5ddd7f47896b42ca93a361334c1dbf99ae740810 100644 --- a/frameworks/core/components_ng/base/view_stack_processor.h +++ b/frameworks/core/components_ng/base/view_stack_processor.h @@ -275,6 +275,7 @@ public: // create wrappingComponentsMap and the component to map and then Push // the map to the render component stack. ACE_FORCE_EXPORT void Push(const RefPtr& element, bool isCustomView = false); + ACE_FORCE_EXPORT void PushPtr(int64_t elementPtr); // Wrap the components map for the stack top and then pop the stack. // Add the wrapped component has child of the new stack top's main component.