Flutter 返回原生的上一页

最近写 Flutter 页面需要嵌入原生页面,发现 Flutter 中似乎没有返回上一页的功能,在 Android 中就是返回上一个 activity。

众所周知,Flutter 嵌入原生 Android 时,需要用一个空的 activity 来承载,Flutter 作为一个 view 添加进当前的 activity,从 Flutter 的角度来说,这个 FlutterView 就是一个 App 了,所以不能返回其实是个正常逻辑,因为它已经在第一页了,所以我们其实要做的是退出当前的 Flutter App。

现在我的 Flutter 页面上有一个导航条,如下图:


截屏2019-10-22下午7.24.43.png

我需要为左边的返回键实现返回上一个原生页面的功能,一开始想到的是使用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的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容