Implemented a reload method in webview_flutter (#974)
diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md
index 39ea0b7..0812ce7 100644
--- a/packages/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.2
+
+* Added a reload method to the WebView controller.
+
 ## 0.1.1
 
 * Added a `currentUrl` accessor for the WebView controller to look up what URL
diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
index 1a8019c..1d49837 100644
--- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
+++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
@@ -53,6 +53,9 @@
       case "goForward":
         goForward(methodCall, result);
         break;
+      case "reload":
+        reload(methodCall, result);
+        break;
       case "currentUrl":
         currentUrl(methodCall, result);
         break;
@@ -89,6 +92,11 @@
     result.success(null);
   }
 
+  private void reload(MethodCall methodCall, Result result) {
+    webView.reload();
+    result.success(null);
+  }
+
   private void currentUrl(MethodCall methodCall, Result result) {
     result.success(webView.getUrl());
   }
@@ -116,7 +124,7 @@
       case 0: // disabled
         webView.getSettings().setJavaScriptEnabled(false);
         break;
-      case 1: //unrestricted
+      case 1: // unrestricted
         webView.getSettings().setJavaScriptEnabled(true);
         break;
       default:
diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart
index 3da5d2d..ee03ffd 100644
--- a/packages/webview_flutter/example/lib/main.dart
+++ b/packages/webview_flutter/example/lib/main.dart
@@ -127,6 +127,14 @@
                       }
                     },
             ),
+            IconButton(
+              icon: const Icon(Icons.replay),
+              onPressed: !webViewReady
+                  ? null
+                  : () {
+                      controller.reload();
+                    },
+            ),
           ],
         );
       },
diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m
index 71e2ba7..981b193 100644
--- a/packages/webview_flutter/ios/Classes/FlutterWebView.m
+++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m
@@ -75,6 +75,8 @@
     [self onGoBack:call result:result];
   } else if ([[call method] isEqualToString:@"goForward"]) {
     [self onGoForward:call result:result];
+  } else if ([[call method] isEqualToString:@"reload"]) {
+    [self onReload:call result:result];
   } else if ([[call method] isEqualToString:@"currentUrl"]) {
     [self onCurrentUrl:call result:result];
   } else {
@@ -118,6 +120,11 @@
   result(nil);
 }
 
+- (void)onReload:(FlutterMethodCall*)call result:(FlutterResult)result {
+  [_webView reload];
+  result(nil);
+}
+
 - (void)onCurrentUrl:(FlutterMethodCall*)call result:(FlutterResult)result {
   _currentUrl = [[_webView URL] absoluteString];
   result(_currentUrl);
diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart
index a2ba394..ade8581 100644
--- a/packages/webview_flutter/lib/webview_flutter.dart
+++ b/packages/webview_flutter/lib/webview_flutter.dart
@@ -249,12 +249,17 @@
     return _channel.invokeMethod("goForward");
   }
 
+  /// Reloads the current URL.
+  Future<void> reload() async {
+    return _channel.invokeMethod("reload");
+  }
+
   Future<void> _updateSettings(Map<String, dynamic> update) async {
     return _channel.invokeMethod('updateSettings', update);
   }
 }
 
-// Throws an ArgumentError if url is not a valid url string.
+// Throws an ArgumentError if `url` is not a valid URL string.
 void _validateUrlString(String url) {
   try {
     final Uri uri = Uri.parse(url);
diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart
index d3cdc5e..d83017a 100644
--- a/packages/webview_flutter/test/webview_flutter_test.dart
+++ b/packages/webview_flutter/test/webview_flutter_test.dart
@@ -284,6 +284,33 @@
     controller.goBack();
     expect(await controller.currentUrl(), 'https://youtube.com');
   });
+
+  testWidgets('Reload url', (WidgetTester tester) async {
+    WebViewController controller;
+    await tester.pumpWidget(
+      WebView(
+        initialUrl: 'https://flutter.io',
+        onWebViewCreated: (WebViewController webViewController) {
+          controller = webViewController;
+        },
+      ),
+    );
+
+    final FakePlatformWebView platformWebView =
+        fakePlatformViewsController.lastCreatedView;
+
+    expect(platformWebView.currentUrl, 'https://flutter.io');
+    expect(platformWebView.amountOfReloadsOnCurrentUrl, 0);
+
+    controller.reload();
+
+    expect(platformWebView.currentUrl, 'https://flutter.io');
+    expect(platformWebView.amountOfReloadsOnCurrentUrl, 1);
+
+    controller.loadUrl('https://youtube.com');
+
+    expect(platformWebView.amountOfReloadsOnCurrentUrl, 0);
+  });
 }
 
 class FakePlatformWebView {
@@ -305,6 +332,7 @@
 
   List<String> history = <String>[];
   int currentPosition = -1;
+  int amountOfReloadsOnCurrentUrl = 0;
 
   String get currentUrl => history.isEmpty ? null : history[currentPosition];
   JavaScriptMode javaScriptMode;
@@ -316,6 +344,7 @@
         history = history.sublist(0, currentPosition + 1);
         history.add(url);
         currentPosition++;
+        amountOfReloadsOnCurrentUrl = 0;
         return Future<void>.sync(() {});
       case 'updateSettings':
         if (call.arguments['jsMode'] == null) {
@@ -336,6 +365,9 @@
       case 'goForward':
         currentPosition = min(history.length - 1, currentPosition + 1);
         return Future<void>.sync(() {});
+      case 'reload':
+        amountOfReloadsOnCurrentUrl++;
+        return Future<void>.sync(() {});
         break;
       case 'currentUrl':
         return Future<String>.value(currentUrl);