From 61cd043ec348ff94297c6452f3482b6e054b0145 Mon Sep 17 00:00:00 2001 From: maoruihao Date: Sat, 13 Sep 2025 15:22:28 +0800 Subject: [PATCH] [Repeat] Add null check protection for children_ Signed-off-by: maoruihao --- .../syntax/repeat_virtual_scroll_2_node.cpp | 12 ++++++++-- .../syntax/repeat_virtual_scroll_node.cpp | 2 +- .../core/syntax/repeat_virtual_2_test_ng.cpp | 24 +++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/frameworks/core/components_ng/syntax/repeat_virtual_scroll_2_node.cpp b/frameworks/core/components_ng/syntax/repeat_virtual_scroll_2_node.cpp index 7d830399add..915b6315c24 100644 --- a/frameworks/core/components_ng/syntax/repeat_virtual_scroll_2_node.cpp +++ b/frameworks/core/components_ng/syntax/repeat_virtual_scroll_2_node.cpp @@ -569,9 +569,17 @@ const std::list>& RepeatVirtualScroll2Node::GetChildren(bool /*no // need to order the child. if (!caches_.IsMoveFromToExist()) { caches_.ForEachL1Node( - [&](IndexType index, RIDType rid, const RefPtr& node) -> void { children_.emplace_back(node); }); + [&](IndexType index, RIDType rid, const RefPtr& node) -> void { + if (node) { + children_.emplace_back(node); + } + }); } else { - caches_.ForEachL1NodeWithOnMove([&](const RefPtr& node) -> void { children_.emplace_back(node); }); + caches_.ForEachL1NodeWithOnMove([&](const RefPtr& node) -> void { + if (node) { + children_.emplace_back(node); + } + }); } return children_; diff --git a/frameworks/core/components_ng/syntax/repeat_virtual_scroll_node.cpp b/frameworks/core/components_ng/syntax/repeat_virtual_scroll_node.cpp index 145b2ba79bb..88529405771 100644 --- a/frameworks/core/components_ng/syntax/repeat_virtual_scroll_node.cpp +++ b/frameworks/core/components_ng/syntax/repeat_virtual_scroll_node.cpp @@ -435,8 +435,8 @@ const std::list>& RepeatVirtualScrollNode::GetChildren(bool /*not for (const auto& [index, child] : children) { if (child) { const_cast(this)->RemoveDisappearingChild(child); + children_.emplace_back(child); } - children_.emplace_back(child); } return children_; } diff --git a/test/unittest/core/syntax/repeat_virtual_2_test_ng.cpp b/test/unittest/core/syntax/repeat_virtual_2_test_ng.cpp index 676e0e354c0..0419cbe08bc 100644 --- a/test/unittest/core/syntax/repeat_virtual_2_test_ng.cpp +++ b/test/unittest/core/syntax/repeat_virtual_2_test_ng.cpp @@ -164,6 +164,30 @@ HWTEST_F(RepeatVirtual2TestNg, GetChildren001, TestSize.Level1) EXPECT_EQ(children.size(), 1); } +/** + * @tc.name: GetChildren002 + * @tc.desc: Test node.GetChildren + * @tc.type: FUNC + */ +HWTEST_F(RepeatVirtual2TestNg, GetChildren002, TestSize.Level1) +{ + auto repeatNode = CreateRepeatVirtualNode(10); + repeatNode->caches_.l1Rid4Index_ = { + {0, 1}, {1, 2}, {2, 3}, {3, 4} + }; + RefPtr uiNode = AceType::MakeRefPtr("node", 2003, AceType::MakeRefPtr()); + CacheItem cacheItem = RepeatVirtualScroll2CacheItem::MakeCacheItem(uiNode, true); + CacheItem cacheItem2 = RepeatVirtualScroll2CacheItem::MakeCacheItem(uiNode, true); + cacheItem2->node_ = nullptr; + repeatNode->caches_.cacheItem4Rid_ = { + { 1, cacheItem }, { 2, cacheItem }, { 3, cacheItem }, { 4, cacheItem2 } + }; + EXPECT_EQ(repeatNode->GetChildren().size(), 3); + repeatNode->caches_.moveFromTo_ = {0, 1}; + repeatNode->children_.clear(); + EXPECT_EQ(repeatNode->GetChildren().size(), 3); +} + /** * @tc.name: GetFrameChild001 * @tc.desc: Test caches.GetFrameChild -- Gitee