From 26fabcd41bfa5beaedf718da9d59a0e84cf1cc0d Mon Sep 17 00:00:00 2001 From: Stonekity <596017443@qq.com> Date: Fri, 22 May 2020 05:32:03 +0800 Subject: [PATCH] fix memory leak of android view (#50111) --- .../lib/src/services/platform_views.dart | 1 + .../test/services/platform_views_test.dart | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/flutter/lib/src/services/platform_views.dart b/packages/flutter/lib/src/services/platform_views.dart index 746f3b00c55..cd778879842 100644 --- a/packages/flutter/lib/src/services/platform_views.dart +++ b/packages/flutter/lib/src/services/platform_views.dart @@ -532,6 +532,7 @@ class AndroidViewController { await SystemChannels.platform_views.invokeMethod('dispose', id); _platformViewCreatedCallbacks.clear(); _state = _AndroidViewState.disposed; + PlatformViewsService._instance._focusCallbacks.remove(id); } /// Sizes the Android View. diff --git a/packages/flutter/test/services/platform_views_test.dart b/packages/flutter/test/services/platform_views_test.dart index 57af2237efd..87af3b94709 100644 --- a/packages/flutter/test/services/platform_views_test.dart +++ b/packages/flutter/test/services/platform_views_test.dart @@ -85,6 +85,23 @@ void main() { await viewController.dispose(); }); + test('dispose clears focusCallbacks', () async { + bool didFocus = false; + viewsController.registerViewType('webview'); + final AndroidViewController viewController = PlatformViewsService.initAndroidView( + id: 0, + viewType: 'webview', + layoutDirection: TextDirection.ltr, + onFocus: () { didFocus = true; } + ); + await viewController.setSize(const Size(100.0, 100.0)); + await viewController.dispose(); + final ByteData message = + SystemChannels.platform_views.codec.encodeMethodCall(const MethodCall('viewFocused', 0)); + await SystemChannels.platform_views.binaryMessenger.handlePlatformMessage(SystemChannels.platform_views.name, message, (_) { }); + expect(didFocus, isFalse); + }); + test('resize Android view', () async { viewsController.registerViewType('webview'); await PlatformViewsService.initAndroidView(