美文网首页
Flutter 返回原生的上一页

Flutter 返回原生的上一页

作者: Howshea | 来源:发表于2019-10-22 19:53 被阅读0次

    最近写 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的。

    相关文章

      网友评论

          本文标题:Flutter 返回原生的上一页

          本文链接:https://www.haomeiwen.com/subject/lsrcvctx.html