diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index 64cb02db86f..48b96405d38 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 4.7.0 + +* Adds support to track scroll position changes. +* Updates minimum supported SDK version to Flutter 3.16.6/Dart 3.2.3. + ## 4.6.0 * Adds support for custom handling of JavaScript dialogs. See diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 915a56c4bc9..a18c1be0345 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -503,10 +503,16 @@ Future main() async { final Completer pageLoaded = Completer(); final WebViewController controller = WebViewController(); + ScrollPositionChange? recordedPosition; unawaited(controller.setJavaScriptMode(JavaScriptMode.unrestricted)); unawaited(controller.setNavigationDelegate(NavigationDelegate( onPageFinished: (_) => pageLoaded.complete(), ))); + unawaited(controller.setOnScrollPositionChange( + (ScrollPositionChange contentOffsetChange) { + recordedPosition = contentOffsetChange; + })); + unawaited(controller.loadRequest(Uri.parse( 'data:text/html;charset=utf-8;base64,$scrollTestPageBase64', ))); @@ -527,17 +533,23 @@ Future main() async { // time to settle. expect(scrollPos.dx, isNot(X_SCROLL)); expect(scrollPos.dy, isNot(Y_SCROLL)); + expect(recordedPosition?.x, isNot(X_SCROLL)); + expect(recordedPosition?.y, isNot(Y_SCROLL)); await controller.scrollTo(X_SCROLL, Y_SCROLL); scrollPos = await controller.getScrollPosition(); expect(scrollPos.dx, X_SCROLL); expect(scrollPos.dy, Y_SCROLL); + expect(recordedPosition?.x, X_SCROLL); + expect(recordedPosition?.y, Y_SCROLL); // Check scrollBy() (on top of scrollTo()) await controller.scrollBy(X_SCROLL, Y_SCROLL); scrollPos = await controller.getScrollPosition(); expect(scrollPos.dx, X_SCROLL * 2); expect(scrollPos.dy, Y_SCROLL * 2); + expect(recordedPosition?.x, X_SCROLL * 2); + expect(recordedPosition?.y, Y_SCROLL * 2); }); }); diff --git a/packages/webview_flutter/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/webview_flutter/example/pubspec.yaml index 805324927ae..789d9498a0c 100644 --- a/packages/webview_flutter/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/example/pubspec.yaml @@ -17,8 +17,8 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ - webview_flutter_android: ^3.14.0 - webview_flutter_wkwebview: ^3.11.0 + webview_flutter_android: ^3.15.0 + webview_flutter_wkwebview: ^3.12.0 dev_dependencies: build_runner: ^2.1.5 diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview_controller.dart b/packages/webview_flutter/webview_flutter/lib/src/webview_controller.dart index d917d7637c2..603f9cf4be3 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview_controller.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview_controller.dart @@ -398,6 +398,13 @@ class WebViewController { Future getUserAgent() { return platform.getUserAgent(); } + + /// Sets a listener for scroll position changes. + Future setOnScrollPositionChange( + void Function(ScrollPositionChange change)? onScrollPositionChange, + ) { + return platform.setOnScrollPositionChange(onScrollPositionChange); + } } /// Permissions request when web content requests access to protected resources. diff --git a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart index 29a7d48cd57..97f127def1a 100644 --- a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart @@ -23,6 +23,7 @@ export 'package:webview_flutter_platform_interface/webview_flutter_platform_inte PlatformWebViewPermissionRequest, PlatformWebViewWidgetCreationParams, ProgressCallback, + ScrollPositionChange, UrlChange, WebResourceError, WebResourceErrorCallback, diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index b6d8bf8663d..6307d713f34 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 4.6.0 +version: 4.7.0 environment: sdk: ^3.2.3 @@ -19,9 +19,9 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_android: ^3.14.0 + webview_flutter_android: ^3.15.0 webview_flutter_platform_interface: ^2.10.0 - webview_flutter_wkwebview: ^3.11.0 + webview_flutter_wkwebview: ^3.12.0 dev_dependencies: build_runner: ^2.1.5 diff --git a/packages/webview_flutter/webview_flutter/test/webview_controller_test.dart b/packages/webview_flutter/webview_flutter/test/webview_controller_test.dart index 9eb5343f84d..6cae01a4941 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_controller_test.dart @@ -474,6 +474,24 @@ void main() { ); await expectLater(webViewController.getUserAgent(), completion(userAgent)); }); + + test('setOnScrollPositionChange', () async { + final MockPlatformWebViewController mockPlatformWebViewController = + MockPlatformWebViewController(); + + final WebViewController webViewController = WebViewController.fromPlatform( + mockPlatformWebViewController, + ); + + void onScrollPositionChange(ScrollPositionChange change) {} + + await webViewController.setOnScrollPositionChange(onScrollPositionChange); + + verify( + mockPlatformWebViewController + .setOnScrollPositionChange(onScrollPositionChange), + ); + }); } class TestPlatformWebViewPermissionRequest