From d5851fdfafc3fc42a6ef28f353a650202c3f41d1 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Sun, 2 Mar 2025 23:38:11 +0800 Subject: [PATCH 1/6] WIP: lifecycle callbacks --- arkoala-arkts/arkui/src/Application.ts | 1 - arkoala-arkts/arkui/src/ArkStructBase.ts | 14 +++++++++++++- .../user/src/ets/pages/homePage/main.ets | 9 +++++++++ arkoala-arkts/trivial/user/src/Page.ts | 2 +- arkoala-arkts/trivial/user/src/ets/page1.ets | 16 ++++++++++++++++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/arkoala-arkts/arkui/src/Application.ts b/arkoala-arkts/arkui/src/Application.ts index f049cd021..30d8feaa7 100644 --- a/arkoala-arkts/arkui/src/Application.ts +++ b/arkoala-arkts/arkui/src/Application.ts @@ -202,7 +202,6 @@ export class Application { } } } - InteropNativeModule._NativeLog(`started with ${root?.peer}`) return root!.peer.ptr } diff --git a/arkoala-arkts/arkui/src/ArkStructBase.ts b/arkoala-arkts/arkui/src/ArkStructBase.ts index ce99fe7ee..911213309 100644 --- a/arkoala-arkts/arkui/src/ArkStructBase.ts +++ b/arkoala-arkts/arkui/src/ArkStructBase.ts @@ -1,4 +1,4 @@ -import { remember } from "@koalaui/runtime" +import { remember, rememberDisposable, rememberMutableState, scheduleCallback } from "@koalaui/runtime" import { ArkCustomComponentImpl } from "./ArkCustomComponent"; import { ArkComponentRoot } from "./ArkComponentRoot"; import { ArkCommonMethodComponent } from "./generated"; @@ -43,7 +43,19 @@ export abstract class ArkStructBase extends ArkCustomComponentImpl initializers?: T_Options ): void { ArkComponentRoot(this, () => { + // TODO: or after onPageShow() handling? this.__updateStruct(initializers) + let inited = rememberMutableState(false) + rememberDisposable(() => { + scheduleCallback(() => { + this.onPageShow() + inited.value = true + }) + return true + }, (inited: boolean|undefined) => scheduleCallback(() => { + this.onPageHide() + })) + if (!inited.value) return this.__build(attributes, content, initializers) }) } diff --git a/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets b/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets index 035e19b8a..2f26e4851 100644 --- a/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets +++ b/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets @@ -34,6 +34,14 @@ export struct MainPage { isPerf: boolean = false + onPageShow() { + console.log('onPageShow') + } + + onPageHide() { + console.log('onPageHide') + } + @Builder build2() { const count = 1500 @@ -49,6 +57,7 @@ export struct MainPage { } build() { + console.log('build') if (this.isPerf) { const count = 100 let perfData = new Array(count) diff --git a/arkoala-arkts/trivial/user/src/Page.ts b/arkoala-arkts/trivial/user/src/Page.ts index 1ee9695b6..0236e76a6 100644 --- a/arkoala-arkts/trivial/user/src/Page.ts +++ b/arkoala-arkts/trivial/user/src/Page.ts @@ -8,7 +8,7 @@ export class ComExampleTrivialApplication extends UserView { this.params = params } getBuilder(): UserViewBuilder { - console.log(`ComExampleTrivialApplication`) + console.log(`getBuilder() ComExampleTrivialApplication`) /** @memo */ let wrapper = () => { Page1() diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index d489d0e48..67518a840 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -104,6 +104,7 @@ struct Page1 { Button("Blinker") .width(200).height(100) .backgroundColor('#ff0000') + Page2() } ForEach(this.data, (item: string, index: number) => { @@ -147,3 +148,18 @@ struct Page1 { this.visible = !this.visible } } + +@Component +struct Page2 { + onPageShow() { + console.log('onPageShow') + } + + onPageHide() { + console.log('onPageHide') + } + + build() { + console.log('Page2 build') + } +} \ No newline at end of file -- Gitee From 146f003176043a87d00cb23b07e36fd1f646c9cd Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 3 Mar 2025 00:18:34 +0800 Subject: [PATCH 2/6] Works --- arkoala-arkts/shopping/user/src/ets/page1.ets | 33 ------------------- arkoala-arkts/trivial/user/src/ets/page1.ets | 4 +-- .../native/src/generated/dummy_impl.cc | 22 ++----------- 3 files changed, 5 insertions(+), 54 deletions(-) delete mode 100644 arkoala-arkts/shopping/user/src/ets/page1.ets diff --git a/arkoala-arkts/shopping/user/src/ets/page1.ets b/arkoala-arkts/shopping/user/src/ets/page1.ets deleted file mode 100644 index c1bb6800a..000000000 --- a/arkoala-arkts/shopping/user/src/ets/page1.ets +++ /dev/null @@ -1,33 +0,0 @@ -@Entry -@Component -struct Page1 { - @State color1: string = '#ff0000' - @State color2: string = '#00ff00' - @State state: number = 1 - - build() { - Column() { - Button("Hi") - .backgroundColor(this.color1) - .width(200).height(100) - .onClick((e?: ClickEvent) => { this.swap() }) - Button("Bye") - .backgroundColor(this.color2) - .width(200).height(100) - .onClick((e?: ClickEvent) => { this.swap() }) - Button("Click! " + this.state).width(200).height(100) - .width(50) - .onClick((e?: ClickEvent) => { - this.state++ - console.log("#### Set Button onClick! #" + this.state) - }) - } - } - - swap(): void { - console.log("#### Swap") - let tmp = this.color1 - this.color1 = this.color2 - this.color2 = tmp - } -} \ No newline at end of file diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index 67518a840..391b880a5 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -141,7 +141,7 @@ struct Page1 { } swap(): void { - console.log("#### Swap") + console.log("#### Swap2") let tmp = this.color1 this.color1 = this.color2 this.color2 = tmp @@ -160,6 +160,6 @@ struct Page2 { } build() { - console.log('Page2 build') + console.log('Page2 build()') } } \ No newline at end of file diff --git a/arkoala/framework/native/src/generated/dummy_impl.cc b/arkoala/framework/native/src/generated/dummy_impl.cc index 0d9f656cc..9ee749217 100644 --- a/arkoala/framework/native/src/generated/dummy_impl.cc +++ b/arkoala/framework/native/src/generated/dummy_impl.cc @@ -140,7 +140,7 @@ void RegisterOnClick(Ark_NativePointer node, const Callback_ClickEvent_Void* eve auto frameNode = AsNode(node); auto callback = *event; callback.resource.hold(callback.resource.resourceId); - auto onEvent = [frameNode, callback](Ark_ClickEvent event) { + auto onEvent = [callback](Ark_ClickEvent event) { if (callback.call) { callback.call(callback.resource.resourceId, event); } @@ -932,26 +932,19 @@ namespace OHOS::Ace::NG::GeneratedModifier { void OnClick0Impl(Ark_NativePointer node, const Callback_ClickEvent_Void* value) { + RegisterOnClick(node, value); if (!needGroupedLog(1)) return; string out("onClick("); WriteToString(&out, value); out.append(") \n"); appendGroupedLog(1, out); - auto frameNode = AsNode(node); - auto callback = *value; - callback.resource.hold(callback.resource.resourceId); - auto onEvent = [callback](Ark_ClickEvent event) { - if (callback.call) { - callback.call(callback.resource.resourceId, event); - } - }; - frameNode->setClickEvent(std::move(onEvent)); } void OnClick1Impl(Ark_NativePointer node, const Callback_ClickEvent_Void* event, const Ark_Number* distanceThreshold) { + RegisterOnClick(node, event); if (!needGroupedLog(1)) return; string out("onClick("); @@ -960,15 +953,6 @@ namespace OHOS::Ace::NG::GeneratedModifier { WriteToString(&out, distanceThreshold); out.append(") \n"); appendGroupedLog(1, out); - auto frameNode = AsNode(node); - auto callback = *event; - callback.resource.hold(callback.resource.resourceId); - auto onEvent = [callback](Ark_ClickEvent event) { - if (callback.call) { - callback.call(callback.resource.resourceId, event); - } - }; - frameNode->setClickEvent(std::move(onEvent)); } } // CommonMethodModifier -- Gitee From b4ac544e5de043956da4c3f406a843b9f3db427e Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 3 Mar 2025 00:31:48 +0800 Subject: [PATCH 3/6] Better --- arkoala-arkts/arkui/src/ArkStructBase.ts | 23 ++++++++++++-------- arkoala-arkts/trivial/user/src/ets/page1.ets | 8 +++---- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/arkoala-arkts/arkui/src/ArkStructBase.ts b/arkoala-arkts/arkui/src/ArkStructBase.ts index 911213309..d47d9f07e 100644 --- a/arkoala-arkts/arkui/src/ArkStructBase.ts +++ b/arkoala-arkts/arkui/src/ArkStructBase.ts @@ -43,19 +43,24 @@ export abstract class ArkStructBase extends ArkCustomComponentImpl initializers?: T_Options ): void { ArkComponentRoot(this, () => { - // TODO: or after onPageShow() handling? - this.__updateStruct(initializers) - let inited = rememberMutableState(false) + let shown = rememberMutableState(false) rememberDisposable(() => { scheduleCallback(() => { - this.onPageShow() - inited.value = true + if (!shown.value) { + console.log(`call onShow() for ${this}`) + this.onPageShow() + shown.value = true + } }) return true - }, (inited: boolean|undefined) => scheduleCallback(() => { - this.onPageHide() - })) - if (!inited.value) return + }, (inited: boolean|undefined) => { + scheduleCallback(() => { + this.onPageHide() + }) + }) + if (!shown.value) return + // TODO: or before onPageShow() handling? + this.__updateStruct(initializers) this.__build(attributes, content, initializers) }) } diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index 391b880a5..b801b86a7 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -96,7 +96,7 @@ struct Page1 { data: Array = makeArray(10) build() { - console.log(`In Page1`) + console.log(`In Page1 build()`) Column() { if (this.visible) { @@ -141,7 +141,7 @@ struct Page1 { } swap(): void { - console.log("#### Swap2") + console.log("#### Swap") let tmp = this.color1 this.color1 = this.color2 this.color2 = tmp @@ -152,11 +152,11 @@ struct Page1 { @Component struct Page2 { onPageShow() { - console.log('onPageShow') + console.log('Page2 onPageShow()') } onPageHide() { - console.log('onPageHide') + console.log('Page2 onPageHide()') } build() { -- Gitee From cbdf54b4fb9a83f47f6f81153fb41e91cdd72c79 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 3 Mar 2025 00:33:04 +0800 Subject: [PATCH 4/6] Prettier logs --- arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets b/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets index 2f26e4851..f706dacf8 100644 --- a/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets +++ b/arkoala-arkts/shopping/user/src/ets/pages/homePage/main.ets @@ -35,11 +35,11 @@ export struct MainPage { isPerf: boolean = false onPageShow() { - console.log('onPageShow') + console.log('shopping onPageShow()') } onPageHide() { - console.log('onPageHide') + console.log('shopping onPageHide()') } @Builder -- Gitee From e33b1716b99509a294a8463c114434944daeee2c Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 3 Mar 2025 01:33:37 +0800 Subject: [PATCH 5/6] Cleaner lifecycles mgmt --- arkoala-arkts/arkui/src/ArkComponentRoot.ts | 30 ++++++++----- arkoala-arkts/arkui/src/ArkStructBase.ts | 46 ++++++++++++-------- arkoala-arkts/trivial/user/src/ets/page1.ets | 17 ++++++-- 3 files changed, 61 insertions(+), 32 deletions(-) diff --git a/arkoala-arkts/arkui/src/ArkComponentRoot.ts b/arkoala-arkts/arkui/src/ArkComponentRoot.ts index 373f0178b..07b1e782d 100644 --- a/arkoala-arkts/arkui/src/ArkComponentRoot.ts +++ b/arkoala-arkts/arkui/src/ArkComponentRoot.ts @@ -13,10 +13,13 @@ * limitations under the License. */ -import { NodeAttach, rememberDisposable, rememberMutableState, scheduleCallback } from "@koalaui/runtime" +import { NodeAttach, rememberDisposable, rememberMutableState, RunEffect, scheduleCallback } from "@koalaui/runtime" import { PeerNode } from "./PeerNode"; import { ArkComponentRootPeer } from "./generated/peers/ArkStaticComponentsPeer"; import { ArkCustomComponent } from "./ArkCustomComponent" +import { int32 } from "@koalaui/common" +import { CurrentRouterTransitionState, WithRouterTransitionState } from "./handwritten"; + /** @memo */ export function ArkComponentRoot( @@ -38,8 +41,8 @@ export function ArkComponentRoot( }, (_: string | undefined)=> { scheduleCallback((): void => { - component.onPageHide() component.aboutToDisappear() + component.onPageHide() }) } ) @@ -47,15 +50,20 @@ export function ArkComponentRoot( () => ArkComponentRootPeer.create(), (node: PeerNode) => { content() - // const state = CurrentRouterTransitionState() - // if (state) { - // RunEffect(state.visibility, visibility => { - // if (visibility == RouterTransitionVisibility.Showing) component.onPageShow?.() - // else if (visibility == RouterTransitionVisibility.Hiding) component.onPageHide?.() - // }) - // component.pageTransition?.() - // } - // if (!appear.value) WithRouterTransitionState(undefined, content) // skip first frame and hide router state + /* + const state = CurrentRouterTransitionState() + if (state) { + RunEffect(state.visibility as int32, visibility => { + if (visibility == 1 ) + component.onPageShow() + else if (visibility == 3) + component.onPageHide() + }) + + component.pageTransition() + if (!appear.value) + WithRouterTransitionState(undefined, content) // skip first frame and hide router state + */ } ) } \ No newline at end of file diff --git a/arkoala-arkts/arkui/src/ArkStructBase.ts b/arkoala-arkts/arkui/src/ArkStructBase.ts index d47d9f07e..806fb97bd 100644 --- a/arkoala-arkts/arkui/src/ArkStructBase.ts +++ b/arkoala-arkts/arkui/src/ArkStructBase.ts @@ -1,7 +1,8 @@ -import { remember, rememberDisposable, rememberMutableState, scheduleCallback } from "@koalaui/runtime" -import { ArkCustomComponentImpl } from "./ArkCustomComponent"; -import { ArkComponentRoot } from "./ArkComponentRoot"; -import { ArkCommonMethodComponent } from "./generated"; +import { MutableState, mutableState, remember, rememberDisposable, rememberMutableState, RunEffect, scheduleCallback } from "@koalaui/runtime" +import { ArkCustomComponentImpl } from "./ArkCustomComponent" +import { ArkCommonMethodComponent } from "./generated" +import { CurrentRouterTransitionState, RouterTransitionState, RouterTransitionVisibility, WithRouterTransitionState } from "./handwritten" +import { int32 } from "@koalaui/common" /** base class for user's structs */ export abstract class ArkStructBase extends ArkCustomComponentImpl { @@ -42,24 +43,35 @@ export abstract class ArkStructBase extends ArkCustomComponentImpl content?: () => void, initializers?: T_Options ): void { - ArkComponentRoot(this, () => { - let shown = rememberMutableState(false) - rememberDisposable(() => { + WithRouterTransitionState(undefined, () => { + RunEffect(CurrentRouterTransitionState(), (state: RouterTransitionState | undefined) => { + let visibility = state != undefined ? (state!.visibility as int32) : -1 + console.log(`Router transition changed: ${visibility}`) + // Write properly when enum import will be fixed. + if (visibility == 2 /* RouterTransitionVisibility.Showing */) { + this.onPageShow() + } + if (visibility == 3 /* RouterTransitionVisibility.Hiding */) { + this.onPageHide() + } + }) + let shown = rememberDisposable(() => { + let state = mutableState(false) scheduleCallback(() => { - if (!shown.value) { - console.log(`call onShow() for ${this}`) - this.onPageShow() - shown.value = true - } + this.aboutToAppear() + // TODO: page visibility doesn't belong here, remove when router transition state propely maintained. + this.onPageShow() + state.value = true }) - return true - }, (inited: boolean|undefined) => { + return state + }, (inited: MutableState | undefined) => scheduleCallback(() => { + this.aboutToDisappear() + // TODO: page visibility doesn't belong here, remove when router transition state propely maintained. this.onPageHide() - }) - }) + })) if (!shown.value) return - // TODO: or before onPageShow() handling? + // TODO: or before visibility handling? this.__updateStruct(initializers) this.__build(attributes, content, initializers) }) diff --git a/arkoala-arkts/trivial/user/src/ets/page1.ets b/arkoala-arkts/trivial/user/src/ets/page1.ets index b801b86a7..722fa29a5 100644 --- a/arkoala-arkts/trivial/user/src/ets/page1.ets +++ b/arkoala-arkts/trivial/user/src/ets/page1.ets @@ -104,7 +104,7 @@ struct Page1 { Button("Blinker") .width(200).height(100) .backgroundColor('#ff0000') - Page2() + Child1() } ForEach(this.data, (item: string, index: number) => { @@ -150,15 +150,24 @@ struct Page1 { } @Component -struct Page2 { +struct Child1 { onPageShow() { - console.log('Page2 onPageShow()') + console.log('Child1 onPageShow()') } onPageHide() { - console.log('Page2 onPageHide()') + console.log('Child1 onPageHide()') } + aboutToAppear() { + console.log('Child1 aboutToAppear()') + } + + aboutToDisappear() { + console.log('Child1 aboutToDisappear()') + } + + build() { console.log('Page2 build()') } -- Gitee From 9b5749f44125c5bc9ea03860c231d15acf8f35c1 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 3 Mar 2025 01:37:32 +0800 Subject: [PATCH 6/6] Basic --- arkoala-arkts/arkui/src/ArkStructBase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arkoala-arkts/arkui/src/ArkStructBase.ts b/arkoala-arkts/arkui/src/ArkStructBase.ts index 806fb97bd..9d452afff 100644 --- a/arkoala-arkts/arkui/src/ArkStructBase.ts +++ b/arkoala-arkts/arkui/src/ArkStructBase.ts @@ -44,7 +44,7 @@ export abstract class ArkStructBase extends ArkCustomComponentImpl initializers?: T_Options ): void { WithRouterTransitionState(undefined, () => { - RunEffect(CurrentRouterTransitionState(), (state: RouterTransitionState | undefined) => { + if (false) RunEffect(CurrentRouterTransitionState(), (state: RouterTransitionState | undefined) => { let visibility = state != undefined ? (state!.visibility as int32) : -1 console.log(`Router transition changed: ${visibility}`) // Write properly when enum import will be fixed. -- Gitee