Skip to content

Commit 05def7f

Browse files
committed
Fix back button handler to be compatible with the WillPopScope widget.
1 parent f3d169e commit 05def7f

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
135135
if (webView.canGoBack()) {
136136
webView.goBack();
137137
} else {
138-
close();
138+
FlutterWebviewPlugin.channel.invokeMethod("onBack", null);
139139
}
140140
return true;
141141
}

lib/src/base.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class FlutterWebviewPlugin {
2323

2424
final _channel = const MethodChannel(_kChannel);
2525

26+
final _onBack = StreamController<Null>.broadcast();
2627
final _onDestroy = StreamController<Null>.broadcast();
2728
final _onUrlChanged = StreamController<String>.broadcast();
2829
final _onStateChanged = StreamController<WebViewStateChanged>.broadcast();
@@ -33,6 +34,9 @@ class FlutterWebviewPlugin {
3334

3435
Future<Null> _handleMessages(MethodCall call) async {
3536
switch (call.method) {
37+
case 'onBack':
38+
_onBack.add(null);
39+
break;
3640
case 'onDestroy':
3741
_onDestroy.add(null);
3842
break;
@@ -64,6 +68,9 @@ class FlutterWebviewPlugin {
6468
/// Listening the OnDestroy LifeCycle Event for Android
6569
Stream<Null> get onDestroy => _onDestroy.stream;
6670

71+
/// Listening the back key press Event for Android
72+
Stream<Null> get onBack => _onBack.stream;
73+
6774
/// Listening url changed
6875
Stream<String> get onUrlChanged => _onUrlChanged.stream;
6976

lib/src/webview_scaffold.dart

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,33 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
6969
Timer _resizeTimer;
7070
StreamSubscription<WebViewStateChanged> _onStateChanged;
7171

72-
var _onDestroy;
72+
var _onBack;
7373

7474
@override
7575
void initState() {
7676
super.initState();
7777
webviewReference.close();
7878

79-
_onDestroy = webviewReference.onDestroy.listen((_) {
80-
if (mounted) {
79+
_onBack = webviewReference.onBack.listen((_) {
80+
if (!mounted) return;
81+
82+
final route = ModalRoute.of(context);
83+
84+
// Close the native widget only if the back operation was not veto'd
85+
// by the [WillPopScope] widget or similar.
86+
final handler = () => webviewReference.close();
87+
route?.addScopedWillPopCallback(handler);
88+
try {
89+
// Perform the 'back' operation.
8190
Navigator.of(context).pop();
91+
} finally {
92+
route?.removeScopedWillPopCallback(handler);
8293
}
8394
});
8495

8596
if (widget.hidden) {
86-
_onStateChanged = webviewReference.onStateChanged.listen((WebViewStateChanged state) {
97+
_onStateChanged =
98+
webviewReference.onStateChanged.listen((WebViewStateChanged state) {
8799
if (state.type == WebViewState.finishLoad) {
88100
webviewReference.show();
89101
}
@@ -94,7 +106,7 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
94106
@override
95107
void dispose() {
96108
super.dispose();
97-
_onDestroy?.cancel();
109+
_onBack?.cancel();
98110
_resizeTimer?.cancel();
99111
webviewReference.close();
100112
if (widget.hidden) {

0 commit comments

Comments
 (0)