diff --git a/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java b/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java index 5256bf39..73604937 100644 --- a/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java +++ b/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java @@ -135,7 +135,7 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { if (webView.canGoBack()) { webView.goBack(); } else { - close(); + FlutterWebviewPlugin.channel.invokeMethod("onBack", null); } return true; } diff --git a/lib/src/base.dart b/lib/src/base.dart index 78cb6b77..1afa1f2c 100644 --- a/lib/src/base.dart +++ b/lib/src/base.dart @@ -23,6 +23,7 @@ class FlutterWebviewPlugin { final _channel = const MethodChannel(_kChannel); + final _onBack = StreamController.broadcast(); final _onDestroy = StreamController.broadcast(); final _onUrlChanged = StreamController.broadcast(); final _onStateChanged = StreamController.broadcast(); @@ -33,6 +34,9 @@ class FlutterWebviewPlugin { Future _handleMessages(MethodCall call) async { switch (call.method) { + case 'onBack': + _onBack.add(null); + break; case 'onDestroy': _onDestroy.add(null); break; @@ -64,6 +68,9 @@ class FlutterWebviewPlugin { /// Listening the OnDestroy LifeCycle Event for Android Stream get onDestroy => _onDestroy.stream; + /// Listening the back key press Event for Android + Stream get onBack => _onBack.stream; + /// Listening url changed Stream get onUrlChanged => _onUrlChanged.stream; diff --git a/lib/src/webview_scaffold.dart b/lib/src/webview_scaffold.dart index 0996ca4e..9f610195 100644 --- a/lib/src/webview_scaffold.dart +++ b/lib/src/webview_scaffold.dart @@ -69,21 +69,30 @@ class _WebviewScaffoldState extends State { Timer _resizeTimer; StreamSubscription _onStateChanged; - var _onDestroy; + var _onBack; @override void initState() { super.initState(); webviewReference.close(); - _onDestroy = webviewReference.onDestroy.listen((_) { - if (mounted) { - Navigator.of(context).pop(); + _onBack = webviewReference.onBack.listen((_) async { + if (!mounted) return; + + // Equivalent of Navigator.maybePop(), except that [webviewReference] + // is closed when the pop goes ahead. Whether the pop was performed + // can't be determined from the return value of Navigator.maybePop(). + final route = ModalRoute.of(context); + final pop = await route?.willPop(); + if (pop == RoutePopDisposition.pop) { + webviewReference.close(); + Navigator.pop(context); } }); if (widget.hidden) { - _onStateChanged = webviewReference.onStateChanged.listen((WebViewStateChanged state) { + _onStateChanged = + webviewReference.onStateChanged.listen((WebViewStateChanged state) { if (state.type == WebViewState.finishLoad) { webviewReference.show(); } @@ -94,7 +103,7 @@ class _WebviewScaffoldState extends State { @override void dispose() { super.dispose(); - _onDestroy?.cancel(); + _onBack?.cancel(); _resizeTimer?.cancel(); webviewReference.close(); if (widget.hidden) {