From a3e4da3e61b0174fe80ac6f6a7a424d22f780439 Mon Sep 17 00:00:00 2001 From: Lorenzo Pichilli Date: Tue, 23 Mar 2021 17:13:40 +0100 Subject: [PATCH] Added isRunning method to the HeadlessInAppWebView class, Fixed iOS WebMessageListener javascript implementation not calling event listeners when onmessage is set, Fixed onCreateContextMenu event on Android where hitTestResult has always null values, fix #742 --- CHANGELOG.md | 7 ++ .../in_app_browser/InAppBrowserActivity.java | 44 +++++++---- .../in_app_webview/InAppWebView.java | 78 +++++++++---------- example/.flutter-plugins-dependencies | 2 +- ios/Classes/Types/WebMessageListener.swift | 7 +- .../android/in_app_webview_controller.dart | 5 +- .../headless_in_app_webview.dart | 19 +++-- pubspec.yaml | 2 +- 8 files changed, 94 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c4b5d13..940d520a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 5.2.1 + +- Added `isRunning` method to the `HeadlessInAppWebView` class +- Fixed iOS `WebMessageListener` javascript implementation not calling event listeners when `onmessage` is set +- Fixed `onCreateContextMenu` event on Android where `hitTestResult` has always `null` values +- Fixed "java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SearchView.setQuery(java.lang.CharSequence, boolean)' on a null object reference" [#742](https://github.com/pichillilorenzo/flutter_inappwebview/issues/742) + ## 5.2.0 - Added `WebMessageChannel` and `WebMessageListener` features diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java index 0d0ea118..3f307acd 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_browser/InAppBrowserActivity.java @@ -401,43 +401,57 @@ public class InAppBrowserActivity extends AppCompatActivity implements InAppBrow @Override public void didChangeTitle(String title) { - if (options.toolbarTopFixedTitle == null || options.toolbarTopFixedTitle.isEmpty()) { + if (actionBar != null && (options.toolbarTopFixedTitle == null || options.toolbarTopFixedTitle.isEmpty())) { actionBar.setTitle(title); } } @Override public void didStartNavigation(String url) { - progressBar.setProgress(0); - searchView.setQuery(url, false); + if (progressBar != null) { + progressBar.setProgress(0); + } + if (searchView != null) { + searchView.setQuery(url, false); + } } @Override public void didUpdateVisitedHistory(String url) { - searchView.setQuery(url, false); + if (searchView != null) { + searchView.setQuery(url, false); + } } @Override public void didFinishNavigation(String url) { - searchView.setQuery(url, false); - progressBar.setProgress(0); + if (searchView != null) { + searchView.setQuery(url, false); + } + if (progressBar != null) { + progressBar.setProgress(0); + } } @Override public void didFailNavigation(String url, int errorCode, String description) { - progressBar.setProgress(0); + if (progressBar != null) { + progressBar.setProgress(0); + } } @Override public void didChangeProgress(int progress) { - progressBar.setVisibility(View.VISIBLE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - progressBar.setProgress(progress, true); - } else { - progressBar.setProgress(progress); - } - if (progress == 100) { - progressBar.setVisibility(View.GONE); + if (progressBar != null) { + progressBar.setVisibility(View.VISIBLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + progressBar.setProgress(progress, true); + } else { + progressBar.setProgress(progress); + } + if (progress == 100) { + progressBar.setVisibility(View.GONE); + } } } diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java index 7fdc3ac6..c9322498 100755 --- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java +++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/in_app_webview/InAppWebView.java @@ -232,11 +232,11 @@ final public class InAppWebView extends InputAwareWebView { if (options.userAgent != null && !options.userAgent.isEmpty()) settings.setUserAgentString(options.userAgent); - else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) + else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) settings.setUserAgentString(WebSettings.getDefaultUserAgent(getContext())); if (options.applicationNameForUserAgent != null && !options.applicationNameForUserAgent.isEmpty()) { - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { String userAgent = (options.userAgent != null && !options.userAgent.isEmpty()) ? options.userAgent : WebSettings.getDefaultUserAgent(getContext()); String userAgentWithApplicationName = userAgent + " " + options.applicationNameForUserAgent; settings.setUserAgentString(userAgentWithApplicationName); @@ -390,7 +390,7 @@ final public class InAppWebView extends InputAwareWebView { @Override public void run() { int newPosition = getScrollY(); - if(initialPositionScrollStoppedTask - newPosition == 0){ + if (initialPositionScrollStoppedTask - newPosition == 0) { // has stopped onScrollStopped(); } else { @@ -436,8 +436,7 @@ final public class InAppWebView extends InputAwareWebView { if (options.disableHorizontalScroll && options.disableVerticalScroll) { return (event.getAction() == MotionEvent.ACTION_MOVE); - } - else if (options.disableHorizontalScroll || options.disableVerticalScroll) { + } else if (options.disableHorizontalScroll || options.disableVerticalScroll) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { // save the x @@ -512,8 +511,7 @@ final public class InAppWebView extends InputAwareWebView { clearFormData(); settings.setSavePassword(false); settings.setSaveFormData(false); - } - else { + } else { settings.setCacheMode(WebSettings.LOAD_DEFAULT); settings.setAppCacheEnabled(true); settings.setSavePassword(true); @@ -703,7 +701,7 @@ final public class InAppWebView extends InputAwareWebView { settings.setUserAgentString(newOptions.userAgent); if (newOptionsMap.get("applicationNameForUserAgent") != null && !options.applicationNameForUserAgent.equals(newOptions.applicationNameForUserAgent) && !newOptions.applicationNameForUserAgent.isEmpty()) { - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { String userAgent = (newOptions.userAgent != null && !newOptions.userAgent.isEmpty()) ? newOptions.userAgent : WebSettings.getDefaultUserAgent(getContext()); String userAgentWithApplicationName = userAgent + " " + options.applicationNameForUserAgent; settings.setUserAgentString(userAgentWithApplicationName); @@ -797,7 +795,7 @@ final public class InAppWebView extends InputAwareWebView { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) if (newOptionsMap.get("disabledActionModeMenuItems") != null && (options.disabledActionModeMenuItems == null || - !options.disabledActionModeMenuItems.equals(newOptions.disabledActionModeMenuItems))) + !options.disabledActionModeMenuItems.equals(newOptions.disabledActionModeMenuItems))) settings.setDisabledActionModeMenuItems(newOptions.disabledActionModeMenuItems); if (newOptionsMap.get("fantasyFontFamily") != null && !options.fantasyFontFamily.equals(newOptions.fantasyFontFamily)) @@ -834,7 +832,7 @@ final public class InAppWebView extends InputAwareWebView { settings.setMinimumLogicalFontSize(newOptions.minimumLogicalFontSize); if (newOptionsMap.get("initialScale") != null && !options.initialScale.equals(newOptions.initialScale)) - setInitialScale(newOptions.initialScale); + setInitialScale(newOptions.initialScale); if (newOptionsMap.get("needInitialFocus") != null && options.needInitialFocus != newOptions.needInitialFocus) settings.setNeedInitialFocus(newOptions.needInitialFocus); @@ -926,7 +924,7 @@ final public class InAppWebView extends InputAwareWebView { if (newOptionsMap.get("rendererPriorityPolicy") != null && (options.rendererPriorityPolicy.get("rendererRequestedPriority") != newOptions.rendererPriorityPolicy.get("rendererRequestedPriority") || - options.rendererPriorityPolicy.get("waivedWhenNotVisible") != newOptions.rendererPriorityPolicy.get("waivedWhenNotVisible")) && + options.rendererPriorityPolicy.get("waivedWhenNotVisible") != newOptions.rendererPriorityPolicy.get("waivedWhenNotVisible")) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { setRendererPriorityPolicy( (int) newOptions.rendererPriorityPolicy.get("rendererRequestedPriority"), @@ -1120,7 +1118,7 @@ final public class InAppWebView extends InputAwareWebView { List> history = new ArrayList>(); - for(int i = 0; i < currentSize; i++) { + for (int i = 0; i < currentSize; i++) { WebHistoryItem historyItem = currentList.getItemAtIndex(i); HashMap historyItemMap = new HashMap<>(); @@ -1140,10 +1138,10 @@ final public class InAppWebView extends InputAwareWebView { } @Override - protected void onScrollChanged (int x, - int y, - int oldX, - int oldY) { + protected void onScrollChanged(int x, + int y, + int oldX, + int oldY) { super.onScrollChanged(x, y, oldX, oldY); if (floatingContextMenu != null) { @@ -1194,8 +1192,7 @@ final public class InAppWebView extends InputAwareWebView { final String newUserAgent; if (enabled) { newUserAgent = webSettings.getUserAgentString().replace("Mobile", "eliboM").replace("Android", "diordnA"); - } - else { + } else { newUserAgent = webSettings.getUserAgentString().replace("eliboM", "Mobile").replace("diordnA", "Android"); } @@ -1237,12 +1234,9 @@ final public class InAppWebView extends InputAwareWebView { private void sendOnCreateContextMenuEvent() { HitTestResult hitTestResult = getHitTestResult(); - Map hitTestResultMap = new HashMap<>(); - hitTestResultMap.put("type", hitTestResult.getType()); - hitTestResultMap.put("extra", hitTestResult.getExtra()); - Map obj = new HashMap<>(); - obj.put("hitTestResult", hitTestResultMap); + obj.put("type", hitTestResult.getType()); + obj.put("extra", hitTestResult.getExtra()); channel.invokeMethod("onCreateContextMenu", obj); } @@ -1283,21 +1277,21 @@ final public class InAppWebView extends InputAwareWebView { // workaround to hide the Keyboard when the user click outside // on something not focusable such as input or a textarea. containerView - .getHandler() - .postDelayed( - new Runnable() { - @Override - public void run() { - InputMethodManager imm = - (InputMethodManager) getContext().getSystemService(INPUT_METHOD_SERVICE); - if (imm != null && !imm.isAcceptingText()) { + .getHandler() + .postDelayed( + new Runnable() { + @Override + public void run() { + InputMethodManager imm = + (InputMethodManager) getContext().getSystemService(INPUT_METHOD_SERVICE); + if (imm != null && !imm.isAcceptingText()) { - imm.hideSoftInputFromWindow( - containerView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); - } - } - }, - 128); + imm.hideSoftInputFromWindow( + containerView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + } + } + }, + 128); } return connection; } @@ -1353,9 +1347,9 @@ final public class InAppWebView extends InputAwareWebView { if (contextMenu != null) { customMenuItems = (List>) contextMenu.get("menuItems"); Map contextMenuOptionsMap = (Map) contextMenu.get("options"); - if (contextMenuOptionsMap != null) { - contextMenuOptions.parse(contextMenuOptionsMap); - } + if (contextMenuOptionsMap != null) { + contextMenuOptions.parse(contextMenuOptionsMap); + } } customMenuItems = customMenuItems == null ? new ArrayList>() : customMenuItems; @@ -1604,7 +1598,7 @@ final public class InAppWebView extends InputAwareWebView { .replace(PluginScriptsUtil.VAR_RESULT_UUID, resultUuid); sourceToInject = userContentController.generateCodeForScriptEvaluation(sourceToInject, contentWorld); - evaluateJavascript(sourceToInject, null); + evaluateJavascript(sourceToInject, null); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @@ -1621,7 +1615,7 @@ final public class InAppWebView extends InputAwareWebView { } }); } - + public boolean canScrollVertically() { return computeVerticalScrollRange() > computeVerticalScrollExtent(); } diff --git a/example/.flutter-plugins-dependencies b/example/.flutter-plugins-dependencies index 09bebc6b..38737437 100644 --- a/example/.flutter-plugins-dependencies +++ b/example/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_downloader","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/flutter_downloader-1.5.2/","dependencies":[]},{"name":"flutter_inappwebview","path":"/Users/lorenzopichilli/Desktop/flutter_inappwebview/","dependencies":[]},{"name":"integration_test","path":"/Users/lorenzopichilli/fvm/versions/2.1.0-10.0.pre/packages/integration_test/","dependencies":[]},{"name":"path_provider","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.0-nullsafety/","dependencies":[]},{"name":"permission_handler","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/permission_handler-5.1.0+2/","dependencies":[]},{"name":"url_launcher","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.0-nullsafety.6/","dependencies":[]}],"android":[{"name":"flutter_downloader","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/flutter_downloader-1.5.2/","dependencies":[]},{"name":"flutter_inappwebview","path":"/Users/lorenzopichilli/Desktop/flutter_inappwebview/","dependencies":[]},{"name":"integration_test","path":"/Users/lorenzopichilli/fvm/versions/2.1.0-10.0.pre/packages/integration_test/","dependencies":[]},{"name":"path_provider","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.0-nullsafety/","dependencies":[]},{"name":"permission_handler","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/permission_handler-5.1.0+2/","dependencies":[]},{"name":"url_launcher","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.0-nullsafety.6/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.5-nullsafety/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-0.1.0-nullsafety.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-0.2.0-nullsafety/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-0.1.0-nullsafety.3/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-0.1.0-nullsafety.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-0.1.0-nullsafety.2/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_downloader","dependencies":[]},{"name":"flutter_inappwebview","dependencies":[]},{"name":"integration_test","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2021-03-22 16:27:21.616305","version":"2.1.0-10.0.pre"} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_downloader","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/flutter_downloader-1.5.2/","dependencies":[]},{"name":"flutter_inappwebview","path":"/Users/lorenzopichilli/Desktop/flutter_inappwebview/","dependencies":[]},{"name":"integration_test","path":"/Users/lorenzopichilli/fvm/versions/2.1.0-10.0.pre/packages/integration_test/","dependencies":[]},{"name":"path_provider","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.0-nullsafety/","dependencies":[]},{"name":"permission_handler","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/permission_handler-5.1.0+2/","dependencies":[]},{"name":"url_launcher","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.0-nullsafety.6/","dependencies":[]}],"android":[{"name":"flutter_downloader","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/flutter_downloader-1.5.2/","dependencies":[]},{"name":"flutter_inappwebview","path":"/Users/lorenzopichilli/Desktop/flutter_inappwebview/","dependencies":[]},{"name":"integration_test","path":"/Users/lorenzopichilli/fvm/versions/2.1.0-10.0.pre/packages/integration_test/","dependencies":[]},{"name":"path_provider","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.0-nullsafety/","dependencies":[]},{"name":"permission_handler","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/permission_handler-5.1.0+2/","dependencies":[]},{"name":"url_launcher","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher-6.0.0-nullsafety.6/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.5-nullsafety/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-0.1.0-nullsafety.2/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-0.2.0-nullsafety/","dependencies":[]},{"name":"url_launcher_linux","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-0.1.0-nullsafety.3/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-0.1.0-nullsafety.3/","dependencies":[]},{"name":"url_launcher_windows","path":"/Users/lorenzopichilli/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-0.1.0-nullsafety.2/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"flutter_downloader","dependencies":[]},{"name":"flutter_inappwebview","dependencies":[]},{"name":"integration_test","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"permission_handler","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_linux","url_launcher_macos","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2021-03-23 16:33:10.809487","version":"2.1.0-10.0.pre"} \ No newline at end of file diff --git a/ios/Classes/Types/WebMessageListener.swift b/ios/Classes/Types/WebMessageListener.swift index 6447a680..6e283741 100644 --- a/ios/Classes/Types/WebMessageListener.swift +++ b/ios/Classes/Types/WebMessageListener.swift @@ -136,10 +136,9 @@ public class WebMessageListener : FlutterMethodCallDelegate { var event = {data: '\(messageEscaped)'}; if (webMessageListener.onmessage != null) { webMessageListener.onmessage(event); - } else { - for (var listener of webMessageListener.listeners) { - listener(event); - } + } + for (var listener of webMessageListener.listeners) { + listener(event); } } })(); diff --git a/lib/src/in_app_webview/android/in_app_webview_controller.dart b/lib/src/in_app_webview/android/in_app_webview_controller.dart index d4154f5e..0e3c8e22 100644 --- a/lib/src/in_app_webview/android/in_app_webview_controller.dart +++ b/lib/src/in_app_webview/android/in_app_webview_controller.dart @@ -7,6 +7,7 @@ import '../_static_channel.dart'; import '../../types.dart'; import '../../android/webview_feature.dart'; +import '../in_app_webview_controller.dart'; ///Class represents the Android controller that contains only android-specific methods for the WebView. class AndroidInAppWebViewController { @@ -42,7 +43,7 @@ class AndroidInAppWebViewController { } ///Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation. Note that this call does not pause JavaScript. - ///To pause JavaScript globally, use [pauseTimers()]. To resume WebView, call [resume()]. + ///To pause JavaScript globally, use [InAppWebViewController.pauseTimers]. To resume WebView, call [resume]. /// ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#onPause() Future pause() async { @@ -50,7 +51,7 @@ class AndroidInAppWebViewController { await _channel.invokeMethod('pause', args); } - ///Resumes a WebView after a previous call to [pause()]. + ///Resumes a WebView after a previous call to [pause]. /// ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#onResume() Future resume() async { diff --git a/lib/src/in_app_webview/headless_in_app_webview.dart b/lib/src/in_app_webview/headless_in_app_webview.dart index 1799b07d..f544527e 100644 --- a/lib/src/in_app_webview/headless_in_app_webview.dart +++ b/lib/src/in_app_webview/headless_in_app_webview.dart @@ -20,7 +20,9 @@ class HeadlessInAppWebView implements WebView { ///View ID. late final String id; - bool _isDisposed = true; + bool _started = false; + bool _running = false; + static const MethodChannel _sharedChannel = const MethodChannel('com.pichillilorenzo/flutter_headless_inappwebview'); @@ -111,10 +113,10 @@ class HeadlessInAppWebView implements WebView { ///Runs the headless WebView. Future run() async { - if (!_isDisposed) { + if (_started) { return; } - _isDisposed = false; + _started = true; Map args = {}; args.putIfAbsent('id', () => id); args.putIfAbsent( @@ -135,17 +137,24 @@ class HeadlessInAppWebView implements WebView { PullToRefreshOptions(enabled: false).toMap() }); await _sharedChannel.invokeMethod('createHeadlessWebView', args); + _running = true; } ///Disposes the headless WebView. Future dispose() async { - if (_isDisposed) { + if (!_running) { return; } Map args = {}; args.putIfAbsent('id', () => id); await _sharedChannel.invokeMethod('disposeHeadlessWebView', args); - _isDisposed = true; + _started = false; + _running = false; + } + + ///Indicates if the headless WebView is running or not. + bool isRunning() { + return _running; } @override diff --git a/pubspec.yaml b/pubspec.yaml index 592b6056..56728027 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_inappwebview description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window. -version: 5.2.0 +version: 5.2.1 homepage: https://github.com/pichillilorenzo/flutter_inappwebview environment: