HarmonyOS鸿蒙Next中FrameNode的removeChild的child会走aboutToDisappear吗

HarmonyOS鸿蒙Next中FrameNode的removeChild的child会走aboutToDisappear吗 调用FrameNode的removeChild方法去移除子组件后子组件被移除了 但是没有走子组件的aboutToDisappear 怎么才能让子组件的aboutToDisappear触发

3 回复

使用removeChild方法是可以走aboutToDisappear生命周期的,参考demo如下:

import { NodeController, FrameNode, BuilderNode } from '@kit.ArkUI';

@Component
struct TestComponent {
  build() {
    Column() {
      Text('This is a BuilderNode.')
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
    }
    .width('100%')
    .backgroundColor(Color.Gray)
  }

  aboutToAppear() {
    console.error('aboutToAppear');
  }

  aboutToDisappear() {
    console.error('aboutToDisappear');
  }
}

@Builder
function buildComponent() {
  TestComponent()
}

class MyNodeController extends NodeController {
  private rootNode: FrameNode | null = null;
  private builderNode: BuilderNode<[]> | null = null;

  makeNode(uiContext: UIContext): FrameNode | null {
    this.rootNode = new FrameNode(uiContext);
    this.builderNode = new BuilderNode(uiContext, { selfIdealSize: { width: 200, height: 100 } });
    this.builderNode.build(new WrappedBuilder(buildComponent));
    const rootRenderNode = this.rootNode.getRenderNode();
    if (rootRenderNode !== null) {
      rootRenderNode.size = { width: 200, height: 200 };
      rootRenderNode.backgroundColor = 0xff00ff00;
      rootRenderNode.appendChild(this.builderNode!.getFrameNode()!.getRenderNode());
    }
    return this.rootNode;
  }

  disposeFrameNode() {
    if (this.rootNode !== null && this.builderNode !== null) {
      this.rootNode.removeChild(this.builderNode.getFrameNode());
      this.builderNode.dispose();
      this.rootNode.dispose();
    }
  }

  removeBuilderNode() {
    const rootRenderNode = this.rootNode!.getRenderNode();
    if (rootRenderNode !== null && this.builderNode !== null && this.builderNode.getFrameNode() !== null) {
      rootRenderNode.removeChild(this.builderNode!.getFrameNode()!.getRenderNode());
    }
  }
}

@Entry
@Component
struct Index {
  private myNodeController: MyNodeController = new MyNodeController();

  build() {
    Column({ space: 4 }) {
      NodeContainer(this.myNodeController)
      Button('FrameNode dispose')
        .onClick(() => {
          this.myNodeController.disposeFrameNode();
        })
        .width('100%')
    }
  }
}

更多关于HarmonyOS鸿蒙Next中FrameNode的removeChild的child会走aboutToDisappear吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,当调用FrameNoderemoveChild方法移除一个子节点时,被移除的子节点不会触发aboutToDisappear生命周期回调。aboutToDisappear通常用于页面或组件即将从视图中消失时的处理逻辑,而removeChild操作直接移除了子节点,不会触发该回调。如果需要处理子节点移除后的逻辑,可以在移除操作后手动执行相关代码。

在HarmonyOS鸿蒙Next中,当调用FrameNoderemoveChild方法时,被移除的子节点不会自动触发aboutToDisappear生命周期回调。aboutToDisappear通常是在页面即将不可见时由系统调用的,而不是在节点被移除时触发。如果你需要在移除子节点时执行特定逻辑,建议在调用removeChild前后手动处理。

回到顶部