在安卓上,手指从屏幕侧边右滑,通常是触发界面回退,当然如果本身就是最后一个页面了,就是退出app。这一默认行为是操作系统所提供的,而flutter则需要拦截这一事件,以决定是否弹框提示用户保存内容,要正确完成这一逻辑有好几个注意点:
1. 理解canPop的含义
通常代码如下:
@override
Widget build(BuildContext context) {
return PopScope(
child: Scaffold(
...
),
canPop: false,
onPopInvokedWithResult: _onPopInvoked,
);
}
如果canPop为true,表示系统页面可默认回退,即不走自有回调;如果canPop为false,表示系统不进行默认回退,而是走自有回调onPopInvokedWithResult。
2. 理解onPopInvokedWithResult的第一个参数didPop
回退事件有可能是手势触发,也可能是程序代码里主动调用了Navigator.pop(),当会触发onPopInvokedWithResult回调,而主动调用Navigator.pop()时,页面会回退,此时didPop为true。如果在onPopInvokedWithResult里根据自己的逻辑又调用了一次Navigator.pop(),就会产生死循环,所以在onPopInvokedWithResult回调里需要先判断didPop,即回退是否已经发生,然后决定是否要进行自有逻辑(比如弹框)。
3. 开户系统支持
Android14后,默认是不让拦截回退手势的,即页面在开始展示时就要决定它能不能回退,然后当回退手势发生时,交由操作系统自已控制。要允许拦截,就需要在android/app/src/main/AndroidManifest.xml中打开开关:
android:enableOnBackInvokedCallback="true"