diff --git a/android/src/main/java/com/optimizely/optimizely_flutter_sdk/FlutterLogbackAppender.java b/android/src/main/java/com/optimizely/optimizely_flutter_sdk/FlutterLogbackAppender.java index 2252cdd..28eec89 100644 --- a/android/src/main/java/com/optimizely/optimizely_flutter_sdk/FlutterLogbackAppender.java +++ b/android/src/main/java/com/optimizely/optimizely_flutter_sdk/FlutterLogbackAppender.java @@ -14,11 +14,17 @@ public class FlutterLogbackAppender extends AppenderBase { public static final String CHANNEL_NAME = "optimizely_flutter_sdk_logger"; - public static MethodChannel channel; + private static MethodChannel channel; private static final Handler mainThreadHandler = new Handler(Looper.getMainLooper()); - public static void setChannel(MethodChannel channel) { - FlutterLogbackAppender.channel = channel; + public static void setChannel(MethodChannel newChannel) { + if (channel == null) { + channel = newChannel; + } + } + + public static void clearChannel() { + channel = null; } @Override diff --git a/android/src/main/java/com/optimizely/optimizely_flutter_sdk/OptimizelyFlutterSdkPlugin.java b/android/src/main/java/com/optimizely/optimizely_flutter_sdk/OptimizelyFlutterSdkPlugin.java index 1893324..512b1a1 100644 --- a/android/src/main/java/com/optimizely/optimizely_flutter_sdk/OptimizelyFlutterSdkPlugin.java +++ b/android/src/main/java/com/optimizely/optimizely_flutter_sdk/OptimizelyFlutterSdkPlugin.java @@ -212,6 +212,9 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + if (channel != null) { + return; + } channel = new MethodChannel(binding.getBinaryMessenger(), "optimizely_flutter_sdk"); channel.setMethodCallHandler(this); context = binding.getApplicationContext(); @@ -232,6 +235,7 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { @Override public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { channel.setMethodCallHandler(null); + channel = null; // Stop and detach the appender if (flutterLogbackAppender != null) { Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); @@ -239,8 +243,8 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { flutterLogbackAppender.stop(); flutterLogbackAppender = null; } - // Clean up the channel - FlutterLogbackAppender.setChannel(null); + // Clean up the logger channel + FlutterLogbackAppender.clearChannel(); } @Override diff --git a/ios/Classes/OptimizelyFlutterLogger.swift b/ios/Classes/OptimizelyFlutterLogger.swift index 7b9217a..57c7adf 100644 --- a/ios/Classes/OptimizelyFlutterLogger.swift +++ b/ios/Classes/OptimizelyFlutterLogger.swift @@ -13,7 +13,13 @@ public class OptimizelyFlutterLogger: NSObject, OPTLogger { } public static func setChannel(_ channel: FlutterMethodChannel) { - loggerChannel = channel + if loggerChannel == nil { + loggerChannel = channel + } + } + + public static func clearChannel() { + loggerChannel = nil } public func log(level: OptimizelyLogLevel, message: String) { diff --git a/ios/Classes/SwiftOptimizelyFlutterSdkPlugin.swift b/ios/Classes/SwiftOptimizelyFlutterSdkPlugin.swift index da2affb..8d17b66 100644 --- a/ios/Classes/SwiftOptimizelyFlutterSdkPlugin.swift +++ b/ios/Classes/SwiftOptimizelyFlutterSdkPlugin.swift @@ -38,6 +38,9 @@ public class SwiftOptimizelyFlutterSdkPlugin: NSObject, FlutterPlugin { /// Registers optimizely_flutter_sdk channel to communicate with the flutter sdk to receive requests and send responses public static func register(with registrar: FlutterPluginRegistrar) { + if channel != nil { + return + } channel = FlutterMethodChannel(name: "optimizely_flutter_sdk", binaryMessenger: registrar.messenger()) let instance = SwiftOptimizelyFlutterSdkPlugin() registrar.addMethodCallDelegate(instance, channel: channel) @@ -50,7 +53,13 @@ public class SwiftOptimizelyFlutterSdkPlugin: NSObject, FlutterPlugin { taskQueue: taskQueue) OptimizelyFlutterLogger.setChannel(loggerChannel) } - + + public func detachFromEngine(for registrar: FlutterPluginRegistrar) { + Self.channel?.setMethodCallHandler(nil) + Self.channel = nil + OptimizelyFlutterLogger.clearChannel() + } + /// Part of FlutterPlugin protocol to handle communication with flutter sdk. /// All method handlers receive a main-thread-safe result callback so that /// any handler calling result() from a background thread (e.g. async SDK