Skip to content

Commit c88e9f2

Browse files
authored
Merge pull request #408 from cvolzke4/will_pop_scope_support
Fix back button handler to be compatible with the WillPopScope widget.
2 parents f3d169e + 29f5536 commit c88e9f2

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
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: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,30 @@ 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) {
81-
Navigator.of(context).pop();
79+
_onBack = webviewReference.onBack.listen((_) async {
80+
if (!mounted) return;
81+
82+
// Equivalent of Navigator.maybePop(), except that [webviewReference]
83+
// is closed when the pop goes ahead. Whether the pop was performed
84+
// can't be determined from the return value of Navigator.maybePop().
85+
final route = ModalRoute.of(context);
86+
final pop = await route?.willPop();
87+
if (pop == RoutePopDisposition.pop) {
88+
webviewReference.close();
89+
Navigator.pop(context);
8290
}
8391
});
8492

8593
if (widget.hidden) {
86-
_onStateChanged = webviewReference.onStateChanged.listen((WebViewStateChanged state) {
94+
_onStateChanged =
95+
webviewReference.onStateChanged.listen((WebViewStateChanged state) {
8796
if (state.type == WebViewState.finishLoad) {
8897
webviewReference.show();
8998
}
@@ -94,7 +103,7 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
94103
@override
95104
void dispose() {
96105
super.dispose();
97-
_onDestroy?.cancel();
106+
_onBack?.cancel();
98107
_resizeTimer?.cancel();
99108
webviewReference.close();
100109
if (widget.hidden) {

0 commit comments

Comments
 (0)