From 29721171c7637196c6b2b5a4c410728e95750605 Mon Sep 17 00:00:00 2001 From: andycall Date: Sun, 12 Nov 2023 23:28:23 +0800 Subject: [PATCH 1/2] fix: fix event.target still can be pointed by event after finalized by GC. --- webf/lib/src/bridge/binding.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webf/lib/src/bridge/binding.dart b/webf/lib/src/bridge/binding.dart index 265322513d..1ecc322b77 100644 --- a/webf/lib/src/bridge/binding.dart +++ b/webf/lib/src/bridge/binding.dart @@ -49,7 +49,7 @@ void _dispatchEventToNative(Event event, bool isCapture) { Pointer? pointer = event.currentTarget?.pointer; int? contextId = event.target?.contextId; WebFController controller = WebFController.getControllerOfJSContextId(contextId)!; - if (contextId != null && pointer != null && pointer.ref.invokeBindingMethodFromDart != nullptr) { + if (contextId != null && pointer != null && pointer.ref.invokeBindingMethodFromDart != nullptr && event.target?.disposed != true) { BindingObject bindingObject = controller.view.getBindingObject(pointer); // Call methods implements at C++ side. DartInvokeBindingMethodsFromDart f = pointer.ref.invokeBindingMethodFromDart.asFunction(); From 06d4b1524537c793a343b467b443d8885e85062a Mon Sep 17 00:00:00 2001 From: andycall Date: Mon, 13 Nov 2023 11:58:37 +0800 Subject: [PATCH 2/2] fix: add checks for currentTarget. --- webf/lib/src/bridge/binding.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webf/lib/src/bridge/binding.dart b/webf/lib/src/bridge/binding.dart index 1ecc322b77..40e8a18686 100644 --- a/webf/lib/src/bridge/binding.dart +++ b/webf/lib/src/bridge/binding.dart @@ -49,7 +49,12 @@ void _dispatchEventToNative(Event event, bool isCapture) { Pointer? pointer = event.currentTarget?.pointer; int? contextId = event.target?.contextId; WebFController controller = WebFController.getControllerOfJSContextId(contextId)!; - if (contextId != null && pointer != null && pointer.ref.invokeBindingMethodFromDart != nullptr && event.target?.disposed != true) { + if (contextId != null && + pointer != null && + pointer.ref.invokeBindingMethodFromDart != nullptr && + event.target?.pointer?.ref.disposed != true && + event.currentTarget?.pointer?.ref.disposed != true + ) { BindingObject bindingObject = controller.view.getBindingObject(pointer); // Call methods implements at C++ side. DartInvokeBindingMethodsFromDart f = pointer.ref.invokeBindingMethodFromDart.asFunction();