Skip to content

Commit 6554751

Browse files
authored
[webview_flutter_wkwebview] Add a listener for the canGoBack property change on the iOS platform. (flutter#8203)
Added a listener callback for the canGoBack property on iOS. Since it can only be effectively implemented on iOS, it is only exposed in the WKWebView layer. Fixes flutter/flutter#158160
1 parent c6caf68 commit 6554751

File tree

4 files changed

+72
-2
lines changed

4 files changed

+72
-2
lines changed

packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
## NEXT
1+
## 3.17.0
22

3+
* Adds a change listener for the `canGoBack` property. See
4+
`WebKitWebViewController.setOnCanGoBackChange`.
35
* Updates minimum supported SDK version to Flutter 3.22/Dart 3.4.
46

57
## 3.16.3

packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ class WebKitWebViewController extends PlatformWebViewController {
160160
},
161161
);
162162

163+
_webView.addObserver(
164+
_webView,
165+
keyPath: 'canGoBack',
166+
options: <NSKeyValueObservingOptions>{
167+
NSKeyValueObservingOptions.newValue,
168+
},
169+
);
170+
163171
final WeakReference<WebKitWebViewController> weakThis =
164172
WeakReference<WebKitWebViewController>(this);
165173
_uiDelegate = _webKitParams.webKitProxy.createUIDelegate(
@@ -299,6 +307,12 @@ class WebKitWebViewController extends PlatformWebViewController {
299307
final NSUrl? url = change[NSKeyValueChangeKey.newValue] as NSUrl?;
300308
urlChangeCallback(UrlChange(url: await url?.getAbsoluteString()));
301309
}
310+
case 'canGoBack':
311+
if (controller._onCanGoBackChangeCallback != null) {
312+
final bool canGoBack =
313+
change[NSKeyValueChangeKey.newValue]! as bool;
314+
controller._onCanGoBackChangeCallback!(canGoBack);
315+
}
302316
}
303317
};
304318
}),
@@ -315,6 +329,7 @@ class WebKitWebViewController extends PlatformWebViewController {
315329
bool _zoomEnabled = true;
316330
WebKitNavigationDelegate? _currentNavigationDelegate;
317331

332+
void Function(bool)? _onCanGoBackChangeCallback;
318333
void Function(JavaScriptConsoleMessage)? _onConsoleMessageCallback;
319334
void Function(PlatformWebViewPermissionRequest)? _onPermissionRequestCallback;
320335

@@ -602,6 +617,12 @@ class WebKitWebViewController extends PlatformWebViewController {
602617
.addUserScript(userScript);
603618
}
604619

620+
/// Sets the listener for canGoBack changes.
621+
Future<void> setOnCanGoBackChange(
622+
void Function(bool) onCanGoBackChangeCallback) async {
623+
_onCanGoBackChangeCallback = onCanGoBackChangeCallback;
624+
}
625+
605626
/// Sets a callback that notifies the host application of any log messages
606627
/// written to the JavaScript console.
607628
///

packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter_wkwebview
22
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
33
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 3.16.3
5+
version: 3.17.0
66

77
environment:
88
sdk: ^3.5.0

packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,53 @@ window.addEventListener("error", function(e) {
15501550
});
15511551
});
15521552

1553+
test('setOnCanGoBackChange', () async {
1554+
final MockWKWebViewIOS mockWebView = MockWKWebViewIOS();
1555+
1556+
late final void Function(
1557+
String keyPath,
1558+
NSObject object,
1559+
Map<NSKeyValueChangeKey, Object?> change,
1560+
) webViewObserveValue;
1561+
1562+
final WebKitWebViewController controller = createControllerWithMocks(
1563+
createMockWebView: (
1564+
_, {
1565+
void Function(
1566+
String keyPath,
1567+
NSObject object,
1568+
Map<NSKeyValueChangeKey, Object?> change,
1569+
)? observeValue,
1570+
}) {
1571+
webViewObserveValue = observeValue!;
1572+
return mockWebView;
1573+
},
1574+
);
1575+
1576+
verify(
1577+
mockWebView.addObserver(
1578+
mockWebView,
1579+
keyPath: 'canGoBack',
1580+
options: <NSKeyValueObservingOptions>{
1581+
NSKeyValueObservingOptions.newValue,
1582+
},
1583+
),
1584+
);
1585+
1586+
late final bool callbackCanGoBack;
1587+
1588+
await controller.setOnCanGoBackChange(
1589+
(bool canGoBack) => callbackCanGoBack = canGoBack);
1590+
1591+
webViewObserveValue(
1592+
'canGoBack',
1593+
mockWebView,
1594+
<NSKeyValueChangeKey, Object?>{NSKeyValueChangeKey.newValue: true},
1595+
);
1596+
1597+
expect(callbackCanGoBack, true);
1598+
});
1599+
15531600
test('setOnScrollPositionChange', () async {
15541601
final WebKitWebViewController controller = createControllerWithMocks();
15551602

0 commit comments

Comments
 (0)