From 48decb1025f14f89a8be79bb2fe5c75efa2b0b29 Mon Sep 17 00:00:00 2001 From: iPel Date: Mon, 10 Jul 2023 11:42:20 +0800 Subject: [PATCH] fix(android): sticky header not deleted from ControllerManager (#3356) may crash in vue2 when recreating view with same id Co-authored-by: siguangli Co-authored-by: OpenHippy <124017524+open-hippy@users.noreply.github.com> --- .../hippy/uimanager/ControllerManager.java | 20 ++++++++++--------- .../renderer/node/ListItemRenderNode.java | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java index 9076d4e0cad..6abbfe344dd 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/uimanager/ControllerManager.java @@ -527,7 +527,7 @@ private boolean checkRecyclable(@Nullable HippyViewController controller, boolea @SuppressWarnings({"unchecked", "rawtypes"}) public void deleteChildRecursive(int rootId, ViewGroup parent, View child, boolean recyclable) { - if (parent == null || child == null) { + if (child == null) { return; } HippyViewController childController = null; @@ -555,15 +555,17 @@ public void deleteChildRecursive(int rootId, ViewGroup parent, View child, boole } } } - String parentTag = NativeViewTag.getClassName(parent); - if (parentTag != null) { - HippyViewController parentController = mControllerRegistry.getViewController( - parentTag); - if (parentController != null) { - parentController.deleteChild(parent, child); + if (parent != null) { + String parentTag = NativeViewTag.getClassName(parent); + if (parentTag != null) { + HippyViewController parentController = mControllerRegistry.getViewController( + parentTag); + if (parentController != null) { + parentController.deleteChild(parent, child); + } + } else { + parent.removeView(child); } - } else { - parent.removeView(child); } mControllerRegistry.removeView(rootId, child.getId()); if (checkRecyclable(childController, recyclable) && childTag != null) { diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/node/ListItemRenderNode.java b/renderer/native/android/src/main/java/com/tencent/renderer/node/ListItemRenderNode.java index 3e5f09b208f..71a7f4a8f71 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/node/ListItemRenderNode.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/node/ListItemRenderNode.java @@ -69,7 +69,7 @@ private void removeView() { if (parentNode != null) { mControllerManager.deleteChild(mRootId, parentNode.getId(), mId, true); } else { - removeChildrenView(this); + mControllerManager.deleteChildRecursive(mRootId, null, getHostView(), true); } }