From 286a6f1c4eb1531187ab54c4100f900037533c8f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 14 Jun 2022 09:39:23 -0700 Subject: [PATCH 1/2] fix error call to remove observer --- .../lib/src/web_kit_webview_widget.dart | 28 ++++++++++++++++--- .../test/src/web_kit_webview_widget_test.dart | 10 +++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart index 05a77f56f851..ce48e9d27e16 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart @@ -69,6 +69,12 @@ class _WebKitWebViewWidgetState extends State { ); } + @override + void dispose() { + super.dispose(); + controller._dispose(); + } + @override Widget build(BuildContext context) { return widget.onBuildWidget(controller); @@ -93,6 +99,7 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { bool _zoomEnabled = true; bool _hasNavigationDelegate = false; + bool _progressObserverSet = false; final Map _scriptMessageHandlers = {}; @@ -452,17 +459,20 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { await _resetUserScripts(removedJavaScriptChannels: javascriptChannelNames); } - Future _setHasProgressTracking(bool hasProgressTracking) { + Future _setHasProgressTracking(bool hasProgressTracking) async { if (hasProgressTracking) { - return webView.addObserver( + _progressObserverSet = true; + await webView.addObserver( webView, keyPath: 'estimatedProgress', options: { NSKeyValueObservingOptions.newValue, }, ); - } else { - return webView.removeObserver(webView, keyPath: 'estimatedProgress'); + } else if (_progressObserverSet) { + // Calls to removeObserver before addObserver causes a crash. + _progressObserverSet = false; + await webView.removeObserver(webView, keyPath: 'estimatedProgress'); } } @@ -593,6 +603,16 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { return value.toString(); } + + void _dispose() { + if (_progressObserverSet) { + _progressObserverSet = false; + // It is recommended by Apple's documentation that this should be called + // before the WebView is deallocated: + // https://developer.apple.com/documentation/objectivec/nsobject/1408054-removeobserver?language=objc + webView.removeObserver(webView, keyPath: 'estimatedProgress'); + } + } } /// Handles constructing objects and calling static methods. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit_webview_widget_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit_webview_widget_test.dart index 24155d2a05e1..14b68fcb4500 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit_webview_widget_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit_webview_widget_test.dart @@ -1151,6 +1151,16 @@ void main() { verify(mockCallbacksHandler.onProgress(32)); }); + + testWidgets('progress observer is not removed without being set first', + (WidgetTester tester) async { + await buildWidget(tester, hasProgressTracking: false); + + verifyNever(mockWebView.removeObserver( + mockWebView, + keyPath: 'estimatedProgress', + )); + }); }); group('JavascriptChannelRegistry', () { From 57d7cb666984ab65e3e69bc4e401500facc08d62 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 14 Jun 2022 19:59:53 -0700 Subject: [PATCH 2/2] remove _dispose --- .../lib/src/web_kit_webview_widget.dart | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart index ce48e9d27e16..7bb020e1a760 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart @@ -69,12 +69,6 @@ class _WebKitWebViewWidgetState extends State { ); } - @override - void dispose() { - super.dispose(); - controller._dispose(); - } - @override Widget build(BuildContext context) { return widget.onBuildWidget(controller); @@ -603,16 +597,6 @@ class WebKitWebViewPlatformController extends WebViewPlatformController { return value.toString(); } - - void _dispose() { - if (_progressObserverSet) { - _progressObserverSet = false; - // It is recommended by Apple's documentation that this should be called - // before the WebView is deallocated: - // https://developer.apple.com/documentation/objectivec/nsobject/1408054-removeobserver?language=objc - webView.removeObserver(webView, keyPath: 'estimatedProgress'); - } - } } /// Handles constructing objects and calling static methods.