diff --git a/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java b/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java index d18a8653..5256bf39 100644 --- a/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java +++ b/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java @@ -236,6 +236,13 @@ public boolean onShowFileChooser( activity.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); return true; } + + @Override + public void onProgressChanged(WebView view, int progress) { + Map args = new HashMap<>(); + args.put("progress", progress / 100.0); + FlutterWebviewPlugin.channel.invokeMethod("onProgressChanged", args); + } }); } diff --git a/example/lib/main.dart b/example/lib/main.dart index f3ea78d3..2e5c1d74 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -93,6 +93,8 @@ class _MyHomePageState extends State { StreamSubscription _onHttpError; + StreamSubscription _onProgressChanged; + StreamSubscription _onScrollYChanged; StreamSubscription _onScrollXChanged; @@ -132,6 +134,14 @@ class _MyHomePageState extends State { } }); + _onProgressChanged = flutterWebViewPlugin.onProgressChanged.listen((double progress) { + if (mounted) { + setState(() { + _history.add("onProgressChanged: $progress"); + }); + } + }); + _onScrollYChanged = flutterWebViewPlugin.onScrollYChanged.listen((double y) { if (mounted) { setState(() { @@ -172,6 +182,7 @@ class _MyHomePageState extends State { _onUrlChanged.cancel(); _onStateChanged.cancel(); _onHttpError.cancel(); + _onProgressChanged.cancel(); _onScrollXChanged.cancel(); _onScrollYChanged.cancel(); diff --git a/ios/Classes/FlutterWebviewPlugin.m b/ios/Classes/FlutterWebviewPlugin.m index e61aea13..da8afcc4 100644 --- a/ios/Classes/FlutterWebviewPlugin.m +++ b/ios/Classes/FlutterWebviewPlugin.m @@ -114,6 +114,8 @@ - (void)initWebview:(FlutterMethodCall*)call { self.webview.hidden = [hidden boolValue]; self.webview.scrollView.showsHorizontalScrollIndicator = [scrollBar boolValue]; self.webview.scrollView.showsVerticalScrollIndicator = [scrollBar boolValue]; + + [self.webview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:NULL]; WKPreferences* preferences = [[self.webview configuration] preferences]; if ([withJavascript boolValue]) { @@ -191,11 +193,20 @@ - (void)resize:(FlutterMethodCall*)call { } } +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if ([keyPath isEqualToString:@"estimatedProgress"] && object == self.webview) { + [channel invokeMethod:@"onProgressChanged" arguments:@{@"progress": @(self.webview.estimatedProgress)}]; + } else { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + - (void)closeWebView { if (self.webview != nil) { [self.webview stopLoading]; [self.webview removeFromSuperview]; self.webview.navigationDelegate = nil; + [self.webview removeObserver:self forKeyPath:@"estimatedProgress"]; self.webview = nil; // manually trigger onDestroy diff --git a/lib/src/base.dart b/lib/src/base.dart index fe18c7e7..78cb6b77 100644 --- a/lib/src/base.dart +++ b/lib/src/base.dart @@ -28,6 +28,7 @@ class FlutterWebviewPlugin { final _onStateChanged = StreamController.broadcast(); final _onScrollXChanged = StreamController.broadcast(); final _onScrollYChanged = StreamController.broadcast(); + final _onProgressChanged = new StreamController.broadcast(); final _onHttpError = StreamController.broadcast(); Future _handleMessages(MethodCall call) async { @@ -44,6 +45,9 @@ class FlutterWebviewPlugin { case 'onScrollYChanged': _onScrollYChanged.add(call.arguments['yDirection']); break; + case "onProgressChanged": + _onProgressChanged.add(call.arguments["progress"]); + break; case 'onState': _onStateChanged.add( WebViewStateChanged.fromMap( @@ -68,6 +72,9 @@ class FlutterWebviewPlugin { /// more detail than other events Stream get onStateChanged => _onStateChanged.stream; + /// Listening web view loading progress estimation, value between 0.0 and 1.0 + Stream get onProgressChanged => _onProgressChanged.stream; + /// Listening web view y position scroll change Stream get onScrollYChanged => _onScrollYChanged.stream; @@ -194,6 +201,7 @@ class FlutterWebviewPlugin { _onDestroy.close(); _onUrlChanged.close(); _onStateChanged.close(); + _onProgressChanged.close(); _onScrollXChanged.close(); _onScrollYChanged.close(); _onHttpError.close();