Skip to content

Commit f0ef28d

Browse files
authored
Merge pull request #255 from florisvdg/loading-progress
Support for webview’s estimated loading progress
2 parents 17d13e0 + 0588faa commit f0ef28d

File tree

4 files changed

+37
-0
lines changed

4 files changed

+37
-0
lines changed

android/src/main/java/com/flutter_webview_plugin/WebviewManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,13 @@ public boolean onShowFileChooser(
236236
activity.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
237237
return true;
238238
}
239+
240+
@Override
241+
public void onProgressChanged(WebView view, int progress) {
242+
Map<String, Object> args = new HashMap<>();
243+
args.put("progress", progress / 100.0);
244+
FlutterWebviewPlugin.channel.invokeMethod("onProgressChanged", args);
245+
}
239246
});
240247
}
241248

example/lib/main.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ class _MyHomePageState extends State<MyHomePage> {
9393

9494
StreamSubscription<WebViewHttpError> _onHttpError;
9595

96+
StreamSubscription<double> _onProgressChanged;
97+
9698
StreamSubscription<double> _onScrollYChanged;
9799

98100
StreamSubscription<double> _onScrollXChanged;
@@ -132,6 +134,14 @@ class _MyHomePageState extends State<MyHomePage> {
132134
}
133135
});
134136

137+
_onProgressChanged = flutterWebViewPlugin.onProgressChanged.listen((double progress) {
138+
if (mounted) {
139+
setState(() {
140+
_history.add("onProgressChanged: $progress");
141+
});
142+
}
143+
});
144+
135145
_onScrollYChanged = flutterWebViewPlugin.onScrollYChanged.listen((double y) {
136146
if (mounted) {
137147
setState(() {
@@ -172,6 +182,7 @@ class _MyHomePageState extends State<MyHomePage> {
172182
_onUrlChanged.cancel();
173183
_onStateChanged.cancel();
174184
_onHttpError.cancel();
185+
_onProgressChanged.cancel();
175186
_onScrollXChanged.cancel();
176187
_onScrollYChanged.cancel();
177188

ios/Classes/FlutterWebviewPlugin.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ - (void)initWebview:(FlutterMethodCall*)call {
114114
self.webview.hidden = [hidden boolValue];
115115
self.webview.scrollView.showsHorizontalScrollIndicator = [scrollBar boolValue];
116116
self.webview.scrollView.showsVerticalScrollIndicator = [scrollBar boolValue];
117+
118+
[self.webview addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:NULL];
117119

118120
WKPreferences* preferences = [[self.webview configuration] preferences];
119121
if ([withJavascript boolValue]) {
@@ -191,11 +193,20 @@ - (void)resize:(FlutterMethodCall*)call {
191193
}
192194
}
193195

196+
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
197+
if ([keyPath isEqualToString:@"estimatedProgress"] && object == self.webview) {
198+
[channel invokeMethod:@"onProgressChanged" arguments:@{@"progress": @(self.webview.estimatedProgress)}];
199+
} else {
200+
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
201+
}
202+
}
203+
194204
- (void)closeWebView {
195205
if (self.webview != nil) {
196206
[self.webview stopLoading];
197207
[self.webview removeFromSuperview];
198208
self.webview.navigationDelegate = nil;
209+
[self.webview removeObserver:self forKeyPath:@"estimatedProgress"];
199210
self.webview = nil;
200211

201212
// manually trigger onDestroy

lib/src/base.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class FlutterWebviewPlugin {
2828
final _onStateChanged = StreamController<WebViewStateChanged>.broadcast();
2929
final _onScrollXChanged = StreamController<double>.broadcast();
3030
final _onScrollYChanged = StreamController<double>.broadcast();
31+
final _onProgressChanged = new StreamController<double>.broadcast();
3132
final _onHttpError = StreamController<WebViewHttpError>.broadcast();
3233

3334
Future<Null> _handleMessages(MethodCall call) async {
@@ -44,6 +45,9 @@ class FlutterWebviewPlugin {
4445
case 'onScrollYChanged':
4546
_onScrollYChanged.add(call.arguments['yDirection']);
4647
break;
48+
case "onProgressChanged":
49+
_onProgressChanged.add(call.arguments["progress"]);
50+
break;
4751
case 'onState':
4852
_onStateChanged.add(
4953
WebViewStateChanged.fromMap(
@@ -68,6 +72,9 @@ class FlutterWebviewPlugin {
6872
/// more detail than other events
6973
Stream<WebViewStateChanged> get onStateChanged => _onStateChanged.stream;
7074

75+
/// Listening web view loading progress estimation, value between 0.0 and 1.0
76+
Stream<double> get onProgressChanged => _onProgressChanged.stream;
77+
7178
/// Listening web view y position scroll change
7279
Stream<double> get onScrollYChanged => _onScrollYChanged.stream;
7380

@@ -194,6 +201,7 @@ class FlutterWebviewPlugin {
194201
_onDestroy.close();
195202
_onUrlChanged.close();
196203
_onStateChanged.close();
204+
_onProgressChanged.close();
197205
_onScrollXChanged.close();
198206
_onScrollYChanged.close();
199207
_onHttpError.close();

0 commit comments

Comments
 (0)