From 793ced88140745cdaabf46158de43104039122fe Mon Sep 17 00:00:00 2001 From: Nan Date: Thu, 30 Apr 2026 09:58:06 -0700 Subject: [PATCH] fix(android): unsubscribe click listener when Flutter engine detaches When the engine is destroyed (e.g. back press) the singleton listener remains subscribed to the native SDK and any subsequent click event fires on a detached channel and is dropped. Removing the listener in onDetachedFromEngine lets the native SDK queue the click instead, so it replays correctly when Dart re-registers via addNativeClickListener after the engine reattaches. --- .../java/com/onesignal/flutter/OneSignalNotifications.java | 6 ++++++ .../main/java/com/onesignal/flutter/OneSignalPlugin.java | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java index e2b094a6..c48a77a9 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalNotifications.java @@ -227,6 +227,12 @@ public void onNotificationPermissionChange(boolean permission) { invokeMethodOnUiThread("OneSignal#onNotificationPermissionDidChange", hash); } + void onDetachedFromEngine() { + // Unsubscribe so clicks while the engine is dead get queued by the native SDK + // instead of dispatched on a detached channel. + OneSignal.getNotifications().removeClickListener(this); + } + private void lifecycleInit(Result result) { OneSignal.getNotifications().removeForegroundLifecycleListener(this); OneSignal.getNotifications().addForegroundLifecycleListener(this); diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java index 7aa11bf2..5592d437 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java @@ -48,7 +48,9 @@ public void onDetachedFromEngine(@NonNull FlutterPlugin.FlutterPluginBinding bin onDetachedFromEngine(); } - private void onDetachedFromEngine() {} + private void onDetachedFromEngine() { + OneSignalNotifications.getSharedInstance().onDetachedFromEngine(); + } @Override public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {