Skip to content

Commit 7f59bde

Browse files
authored
Merge pull request #125 from theblackcat102/master
Added webview scrolling listener
2 parents 4e49f09 + 7ce7000 commit 7f59bde

File tree

8 files changed

+497
-377
lines changed

8 files changed

+497
-377
lines changed

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,23 @@ flutterWebviewPlugin.onUrlChanged.listen((String url) {
4242
});
4343
```
4444

45+
#### Listen for scroll event in webview
46+
47+
```dart
48+
final flutterWebviewPlugin = new FlutterWebviewPlugin();
49+
flutterWebviewPlugin.onScrollYChanged.listen((double offsetY) { // latest offset value in vertical scroll
50+
// compare vertical scroll changes here with old value
51+
});
52+
53+
flutterWebviewPlugin.onScrollXChanged.listen((double offsetX) { // latest offset value in horizontal scroll
54+
// compare horizontal scroll changes here with old value
55+
});
56+
57+
````
58+
59+
Note: Do note there is a slight difference is scroll distance between ios and android. Android scroll value difference tends to be larger than ios devices.
60+
61+
4562
#### Hidden WebView
4663
4764
```dart
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.flutter_webview_plugin;
2+
3+
import android.content.Context;
4+
import android.util.AttributeSet;
5+
import android.webkit.WebView;
6+
7+
public class ObservableWebView extends WebView {
8+
private OnScrollChangedCallback mOnScrollChangedCallback;
9+
10+
public ObservableWebView(final Context context)
11+
{
12+
super(context);
13+
}
14+
15+
public ObservableWebView(final Context context, final AttributeSet attrs)
16+
{
17+
super(context, attrs);
18+
}
19+
20+
public ObservableWebView(final Context context, final AttributeSet attrs, final int defStyle)
21+
{
22+
super(context, attrs, defStyle);
23+
}
24+
25+
@Override
26+
protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt)
27+
{
28+
super.onScrollChanged(l, t, oldl, oldt);
29+
if(mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t, oldl, oldt);
30+
}
31+
32+
public OnScrollChangedCallback getOnScrollChangedCallback()
33+
{
34+
return mOnScrollChangedCallback;
35+
}
36+
37+
public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback)
38+
{
39+
mOnScrollChangedCallback = onScrollChangedCallback;
40+
}
41+
42+
/**
43+
* Impliment in the activity/fragment/view that you want to listen to the webview
44+
*/
45+
public static interface OnScrollChangedCallback
46+
{
47+
public void onScroll(int l, int t, int oldl, int oldt);
48+
}
49+
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
9797
}
9898
});
9999

100+
observableWebView = (ObservableWebView) webView;
101+
observableWebView.setOnScrollChangedCallback(new ObservableWebView.OnScrollChangedCallback(){
102+
public void onScroll(int x, int y, int oldx, int oldy){
103+
Map<String, Object> yDirection = new HashMap<>();
104+
yDirection.put("yDirection", (double)y);
105+
FlutterWebviewPlugin.channel.invokeMethod("onScrollYChanged", yDirection);
106+
Map<String, Object> xDirection = new HashMap<>();
107+
xDirection.put("xDirection", (double)x);
108+
FlutterWebviewPlugin.channel.invokeMethod("onScrollXChanged", xDirection);
109+
}
110+
});
111+
100112
webView.setWebViewClient(webViewClient);
101113
webView.setWebChromeClient(new WebChromeClient()
102114
{

example/ios/Flutter/flutter_assets/LICENSE

Lines changed: 372 additions & 375 deletions
Large diffs are not rendered by default.

example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@
242242
);
243243
inputPaths = (
244244
"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
245-
"${PODS_ROOT}/../../../../../flutter/bin/cache/artifacts/engine/ios/Flutter.framework",
245+
"${PODS_ROOT}/../../../../../development/flutter/bin/cache/artifacts/engine/ios/Flutter.framework",
246246
"${BUILT_PRODUCTS_DIR}/flutter_webview_plugin/flutter_webview_plugin.framework",
247247
);
248248
name = "[CP] Embed Pods Frameworks";

example/lib/main.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,23 @@ class _MyHomePageState extends State<MyHomePage> {
9797
}
9898
});
9999

100+
101+
_onScrollYChanged = flutterWebviewPlugin.onScrollYChanged.listen((double y) {
102+
if (mounted) {
103+
setState(() {
104+
_history.add("Scroll in Y Direction: $y");
105+
});
106+
}
107+
});
108+
109+
_onScrollXChanged = flutterWebviewPlugin.onScrollXChanged.listen((double x) {
110+
if (mounted) {
111+
setState(() {
112+
_history.add("Scroll in X Direction: $x");
113+
});
114+
}
115+
});
116+
100117
_onStateChanged =
101118
flutterWebviewPlugin.onStateChanged.listen((WebViewStateChanged state) {
102119
if (mounted) {

ios/Classes/FlutterWebviewPlugin.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ - (void)initWebview:(FlutterMethodCall*)call {
9797
self.webview.scrollView.showsHorizontalScrollIndicator = [scrollBar boolValue];
9898
self.webview.scrollView.showsVerticalScrollIndicator = [scrollBar boolValue];
9999

100+
101+
100102
_enableZoom = [withZoom boolValue];
101103

102104
[self.viewController.view addSubview:self.webview];
@@ -111,6 +113,14 @@ - (CGRect)parseRect:(NSDictionary *)rect {
111113
[[rect valueForKey:@"height"] doubleValue]);
112114
}
113115

116+
- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
117+
id xDirection = @{@"xDirection": @(scrollView.contentOffset.x) };
118+
[channel invokeMethod:@"onScrollXChanged" arguments:xDirection];
119+
120+
id yDirection = @{@"yDirection": @(scrollView.contentOffset.y) };
121+
[channel invokeMethod:@"onScrollYChanged" arguments:yDirection];
122+
}
123+
114124
- (void)navigate:(FlutterMethodCall*)call {
115125
if (self.webview != nil) {
116126
NSString *url = call.arguments[@"url"];
@@ -213,6 +223,7 @@ - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigati
213223
}
214224
}
215225

226+
216227
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
217228
[channel invokeMethod:@"onState" arguments:@{@"type": @"startLoad", @"url": webView.URL.absoluteString}];
218229
}

lib/src/base.dart

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class FlutterWebviewPlugin {
1919
final _onDestroy = new StreamController<Null>.broadcast();
2020
final _onUrlChanged = new StreamController<String>.broadcast();
2121
final _onStateChanged = new StreamController<WebViewStateChanged>.broadcast();
22+
final _onScrollXChanged = new StreamController<double>.broadcast();
23+
final _onScrollYChanged = new StreamController<double>.broadcast();
2224
final _onHttpError = new StreamController<WebViewHttpError>.broadcast();
2325

2426
static FlutterWebviewPlugin _instance;
@@ -37,7 +39,13 @@ class FlutterWebviewPlugin {
3739
case 'onUrlChanged':
3840
_onUrlChanged.add(call.arguments['url']);
3941
break;
40-
case 'onState':
42+
case "onScrollXChanged":
43+
_onScrollXChanged.add(call.arguments["xDirection"]);
44+
break;
45+
case "onScrollYChanged":
46+
_onScrollYChanged.add(call.arguments["yDirection"]);
47+
break;
48+
case "onState":
4149
_onStateChanged.add(
4250
new WebViewStateChanged.fromMap(
4351
new Map<String, dynamic>.from(call.arguments)),
@@ -61,6 +69,13 @@ class FlutterWebviewPlugin {
6169
/// more detail than other events
6270
Stream<WebViewStateChanged> get onStateChanged => _onStateChanged.stream;
6371

72+
73+
/// Listening web view y position scroll change
74+
Stream<double> get onScrollYChanged => _onScrollYChanged.stream;
75+
76+
/// Listening web view x position scroll change
77+
Stream<double> get onScrollXChanged => _onScrollXChanged.stream;
78+
6479
Stream<WebViewHttpError> get onHttpError => _onHttpError.stream;
6580

6681
/// Start the Webview with [url]
@@ -172,6 +187,8 @@ class FlutterWebviewPlugin {
172187
_onDestroy.close();
173188
_onUrlChanged.close();
174189
_onStateChanged.close();
190+
_onScrollXChanged.close();
191+
_onScrollYChanged.close();
175192
_onHttpError.close();
176193
_instance = null;
177194
}

0 commit comments

Comments
 (0)