最近写 Flutter 页面需要嵌入原生页面,发现 Flutter 中似乎没有返回上一页的功能,在 Android 中就是返回上一个 activity。
众所周知,Flutter 嵌入原生 Android 时,需要用一个空的 activity 来承载,Flutter 作为一个 view 添加进当前的 activity,从 Flutter 的角度来说,这个 FlutterView 就是一个 App 了,所以不能返回其实是个正常逻辑,因为它已经在第一页了,所以我们其实要做的是退出当前的 Flutter App。
现在我的 Flutter 页面上有一个导航条,如下图:
我需要为左边的返回键实现返回上一个原生页面的功能,一开始想到的是使用Flutter 的 Channel,然后分别在 Android、iOS 原生代码里接收消息,分别实现返回。但是这样太麻烦了,应该有个更简单的方法,毕竟我只是想退出一下。
后来我找到了这个方法 SystemNavigator.pop()
,看一下它的源码:
class SystemNavigator {
SystemNavigator._();
/// Instructs the system navigator to remove this activity from the stack and
/// return to the previous activity.
///
/// On iOS, calls to this method are ignored because Apple's human interface
/// guidelines state that applications should not exit themselves.
///
/// This method should be preferred over calling `dart:io`'s [exit] method, as
/// the latter may cause the underlying platform to act as if the application
/// had crashed.
static Future<void> pop() async {
await SystemChannels.platform.invokeMethod<void>('SystemNavigator.pop');
}
}
可以看到注释上写的很清楚,这个就是用来返回上一个 activity 的,但是上面也提到了,在 iOS 平台上这个方法会被忽略,因为 iOS 里没有退出 App 的说法。另外还提到这个方法要比直接调用 Dart 的 exit 要好,因为 exit 命令会让底层表现的像程序崩溃一样(但是好像也没说 exit 会让宿主 app 异常),所以我们对平台做一下兼容:
onPressed: () {
if(Platform.isAndroid){
SystemNavigator.pop();
} else {
exit(0);
}
},
测了一下,这样写是OK的。