Просмотр исходного кода

Added api to check if can navigate back and forward (#600)

* added callbacks to canGoForward and canGoBack for android

* added flutter tests
added ios implementation

* updated readme
Rafal Wachol 6 лет назад
Родитель
Сommit
afb60fae88

+ 7 - 0
README.md

@@ -252,3 +252,10 @@ Future<Null> goForward();
 Future<Null> stopLoading();
 ```
 
+```dart
+Future<bool> canGoBack();
+```
+
+```dart
+Future<bool> canGoForward();
+```

+ 32 - 1
android/src/main/java/com/flutter_webview_plugin/FlutterWebviewPlugin.java

@@ -84,13 +84,19 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
             case "cleanCookies":
                 cleanCookies(call, result);
                 break;
+            case "canGoBack":
+                canGoBack(result);
+                break;
+            case "canGoForward":
+                canGoForward(result);
+                break;
             default:
                 result.notImplemented();
                 break;
         }
     }
 
-     void openUrl(MethodCall call, MethodChannel.Result result) {
+    void openUrl(MethodCall call, MethodChannel.Result result) {
         boolean hidden = call.argument("hidden");
         String url = call.argument("url");
         String userAgent = call.argument("userAgent");
@@ -181,6 +187,19 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         }
     }
 
+    /**
+     * Checks if can navigate back
+     *
+     * @param result
+     */
+    private void canGoBack(MethodChannel.Result result) {
+        if (webViewManager != null) {
+            result.success(webViewManager.canGoBack());
+        } else {
+            result.error("Webview is null", null, null);
+        }
+    }
+
     /**
      * Navigates back on the Webview.
      */
@@ -191,6 +210,18 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         result.success(null);
     }
 
+    /**
+     * Checks if can navigate forward
+     * @param result
+     */
+    private void canGoForward(MethodChannel.Result result) {
+        if (webViewManager != null) {
+            result.success(webViewManager.canGoForward());
+        } else {
+            result.error("Webview is null", null, null);
+        }
+    }
+
     /**
      * Navigates forward on the Webview.
      */

+ 15 - 0
ios/Classes/FlutterWebviewPlugin.m

@@ -73,6 +73,10 @@ static NSString *const CHANNEL_NAME = @"flutter_webview_plugin";
     } else if ([@"reload" isEqualToString:call.method]) {
         [self reload];
         result(nil);
+    } else if ([@"canGoBack" isEqualToString:call.method]) {
+        [self onCanGoBack:call result:result];
+    } else if ([@"canGoForward" isEqualToString:call.method]) {
+        [self onCanGoForward:call result:result];
     } else {
         result(FlutterMethodNotImplemented);
     }
@@ -283,6 +287,17 @@ static NSString *const CHANNEL_NAME = @"flutter_webview_plugin";
         [self.webview goBack];
     }
 }
+
+- (void)onCanGoBack:(FlutterMethodCall*)call result:(FlutterResult)result {
+  BOOL canGoBack = [self.webview canGoBack];
+  result([NSNumber numberWithBool:canGoBack]);
+}
+
+- (void)onCanGoForward:(FlutterMethodCall*)call result:(FlutterResult)result {
+  BOOL canGoForward = [self.webview canGoForward];
+  result([NSNumber numberWithBool:canGoForward]);
+}
+
 - (void)forward {
     if (self.webview != nil) {
         [self.webview goForward];

+ 6 - 0
lib/src/base.dart

@@ -239,6 +239,12 @@ class FlutterWebviewPlugin {
   /// Navigates back on the Webview.
   Future<Null> goBack() async => await _channel.invokeMethod('back');
 
+  /// Checks if webview can navigate back
+  Future<bool> canGoBack() async => await _channel.invokeMethod('canGoBack');
+
+  /// Checks if webview can navigate back
+  Future<bool> canGoForward() async => await _channel.invokeMethod('canGoForward');
+
   /// Navigates forward on the Webview.
   Future<Null> goForward() async => await _channel.invokeMethod('forward');
 

+ 8 - 1
test/flutter_webview_plugin_test.dart

@@ -12,7 +12,6 @@ void main() {
     webview = new FlutterWebviewPlugin.private(methodChannel);
   });
 
-
   group('Method channel invoke', () {
     test('Should invoke close', () async {
       webview.close();
@@ -38,6 +37,14 @@ void main() {
       webview.show();
       verify(methodChannel.invokeMethod('show')).called(1);
     });
+    test('Should invoke canGoBack', () async {
+      webview.canGoBack();
+      verify(methodChannel.invokeMethod('canGoBack')).called(1);
+    });
+    test('Should invoke canGoForward', () async {
+      webview.canGoForward();
+      verify(methodChannel.invokeMethod('canGoForward')).called(1);
+    });
   });
 }