diff --git a/frameworks/core/components_ng/pattern/menu/menu_view.cpp b/frameworks/core/components_ng/pattern/menu/menu_view.cpp index 73277443129975d4bdbb4305bdce3926b82d2096..75a525ec434c89e61bd8b733cebb0ca854fda09b 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_view.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_view.cpp @@ -844,7 +844,7 @@ static void SetFilter(const RefPtr& targetNode, const RefPtrGetTheme(); CHECK_NULL_VOID(menuTheme); - if (!manager->GetHasFilter() && !manager->GetIsOnAnimation()) { + if (!manager->GetHasFilterWithCheck() && !manager->GetIsOnAnimation()) { bool isBindOverlayValue = targetNode->GetLayoutProperty()->GetIsBindOverlayValue(false); CHECK_NULL_VOID(isBindOverlayValue && menuTheme->GetHasFilter()); // insert columnNode to rootNode diff --git a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp index f357251dcc3e6f91400d624d9986c98463a3e3df..6117fedacd8dfbac3c2b2e5b0ad82ff3253e5f21 100644 --- a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.cpp @@ -169,6 +169,16 @@ void MenuWrapperPattern::OnAttachToFrameNode() RegisterOnTouch(); } +void MenuWrapperPattern::OnDetachFromMainTree() +{ + CHECK_NULL_VOID(filterColumnNode_); + auto pipeline = filterColumnNode_->GetContext(); + CHECK_NULL_VOID(pipeline); + auto overlay = pipeline->GetOverlayManager(); + CHECK_NULL_VOID(overlay); + overlay->RemoveMenuFilter(GetHost()); +} + // close subMenu when mouse move outside void MenuWrapperPattern::HandleMouseEvent(const MouseInfo& info, RefPtr& menuItemPattern) { diff --git a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h index 61a673aae83d5c79e256b542eef2ac2b926a4ed2..5eefbfae23218b743a2b70bc08a5c9a55b8e76eb 100644 --- a/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h +++ b/frameworks/core/components_ng/pattern/menu/wrapper/menu_wrapper_pattern.h @@ -621,6 +621,7 @@ private: void OnModifyDone() override; void InitFocusEvent(); void OnAttachToFrameNode() override; + void OnDetachFromMainTree() override; void RegisterOnTouch(); bool OnDirtyLayoutWrapperSwap(const RefPtr& dirty, const DirtySwapConfig& config) override; // mark self and all children no-draggable diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index 1efe2edadc96a8634bf4e3bbae2c5a30c6166334..d2fa7d139956831ba122e01d2cb534d32fddf8c6 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -7028,21 +7028,32 @@ void OverlayManager::RemoveFilterWithNode(const RefPtr& filterNode) { CHECK_NULL_VOID(filterNode); auto rootNode = filterNode->GetParent(); - CHECK_NULL_VOID(rootNode); + if (rootNode) { + TAG_LOGI(AceLogTag::ACE_OVERLAY, "remove filter sucessfully, filterId: %{public}d", filterNode->GetId()); + rootNode->RemoveChild(filterNode); + rootNode->RebuildRenderContextTree(); + } else { + TAG_LOGI(AceLogTag::ACE_OVERLAY, "filter has no parent, skip remove filterId: %{public}d", filterNode->GetId()); + } auto columnNode = filterColumnNodeWeak_.Upgrade(); auto isRemoveCurrentFilter = columnNode && columnNode->GetId() == filterNode->GetId(); - - TAG_LOGI(AceLogTag::ACE_OVERLAY, "remove filter sucessfully, filterId: %{public}d", filterNode->GetId()); - - rootNode->RemoveChild(filterNode); - rootNode->RebuildRenderContextTree(); - if (isRemoveCurrentFilter) { hasFilter_ = false; } } +bool OverlayManager::GetHasFilterWithCheck() +{ + auto columnNode = filterColumnNodeWeak_.Upgrade(); + if (columnNode) { + return columnNode->IsOnMainTree(); + } else { + hasFilter_ = false; + return hasFilter_; + } +} + void OverlayManager::RemoveFilter() { if (!hasFilter_) { diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index ad28b0c0362a9f36ac6ee6fb8edbe69236ca1e80..f054d6b6ceac022b78c607dcafb71a4fe9fb6811 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -367,6 +367,8 @@ public: RefPtr GetDragPixelMapBadgeNode() const; + bool GetHasFilterWithCheck(); + bool GetHasFilter() { return hasFilter_;