From 4f134a388d0646914b18a104b19b58e075655ceb Mon Sep 17 00:00:00 2001 From: dadameng <982541620@qq.com> Date: Mon, 10 Mar 2025 14:14:00 +0900 Subject: [PATCH] fix memory leaks when remove observer --- example/ios/Runner/GeneratedPluginRegistrant.m | 13 ++++++++++--- lib/src/page_visibility.dart | 11 +++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/example/ios/Runner/GeneratedPluginRegistrant.m b/example/ios/Runner/GeneratedPluginRegistrant.m index 8f2a2bab..c943c942 100755 --- a/example/ios/Runner/GeneratedPluginRegistrant.m +++ b/example/ios/Runner/GeneratedPluginRegistrant.m @@ -18,8 +18,14 @@ @import image_picker_ios; #endif -#if __has_include() -#import +#if __has_include() +#import +#else +@import path_provider_foundation; +#endif + +#if __has_include() +#import #else @import video_player_avfoundation; #endif @@ -35,7 +41,8 @@ @implementation GeneratedPluginRegistrant + (void)registerWithRegistry:(NSObject*)registry { [FlutterBoostPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterBoostPlugin"]]; [FLTImagePickerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTImagePickerPlugin"]]; - [FLTVideoPlayerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTVideoPlayerPlugin"]]; + [PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]]; + [FVPVideoPlayerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FVPVideoPlayerPlugin"]]; [FLTWebViewFlutterPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTWebViewFlutterPlugin"]]; } diff --git a/lib/src/page_visibility.dart b/lib/src/page_visibility.dart index 9cb6e4de..729b0154 100644 --- a/lib/src/page_visibility.dart +++ b/lib/src/page_visibility.dart @@ -68,9 +68,20 @@ class PageVisibilityBinding { /// Unregisters the given observer. void removeObserver(PageVisibilityObserver observer) { + final routesToRemove = >[]; + for (final route in _listeners.keys) { final observers = _listeners[route]; observers?.remove(observer); + + if (observers?.isEmpty ?? false) { + routesToRemove.add(route); + } + } + + for (final route in routesToRemove) { + _listeners.remove(route); + Logger.log('page_visibility, #cleanupEmptyRoute, $route'); } Logger.log('page_visibility, #removeObserver, $observer'); }