导航

导航

如何在两个页面之间切换?

在 iOS 里,想要在多个 viewcontroller 中切换,可以使用 UINavigationController管理 viewcontroller 构成的栈进行显示。

Flutter 中也有类似的实现,使用 Navigator 和 Routes。一个 Route 是应用中屏幕或者页面的抽象概念,而一个 Navigator 是管多个 Route 的 widget。也可以理解把 Route 理解为 UIViewController。而 Navigator 的工作方式和 iOS 里的 UINavigationController 类似,当你想要进入或退出一个新页面的时候,它也可以进行 push() 和 pop() 操作。

To navigate between pages, you have a couple options:想要在不同页面间跳转,你有两个选择:

  • 构建由 route 名称组成的 Map;

  • 直接跳转到一个 route。

下面的示例构建了一个 Map:

void main() {
  runApp(CupertinoApp(
    home: MyAppHome(), // becomes the route named '/'
    routes: <String, WidgetBuilder> {
      '/a': (BuildContext context) => MyPage(title: 'page A'),
      '/b': (BuildContext context) => MyPage(title: 'page B'),
      '/c': (BuildContext context) => MyPage(title: 'page C'),
    },
  ));
}

通过把 route 名称传递给 Naivgator 来实现 push 效果。

Navigator.of(context).pushNamed('/b');

Navigator 类对 Flutter 中的路由事件做处理,还可以用来获取入栈之后的路由的结果。这需要通过 push() 返回的 Future 中的 await 来实现。

例如,要打开一个“定位”页面来让用户选择他们的位置,你需要做如下事情:

Map coordinates = await Navigator.of(context).pushNamed('/location');

然后,在“定位”页面中,一旦用户选择了自己的定位,就 pop() 出栈并返回结果。

Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});

如何跳转到其他应用?

在 iOS 里,想要跳转到其他应用,可以使用特定的 URL scheme。对于系统级别的应用,scheme 都是取决于应用的。在 Flutter 里想要实现这个功能,需要创建原生平台的整合层,或者使用已经存在的 插件,例如url_launcher。

如何退回到 iOS 原生的 viewcontroller?

在 Dart 代码中调用 SystemNavigator.pop() 将会调用下面的 iOS 代码:

UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
  if ([viewController isKindOfClass:[UINavigationController class]]) {
    [((UINavigationController*)viewController) popViewControllerAnimated:NO];
  }

如果这不是你需要的功能,你可以创建你自己的 平台通道 来调用对应的 iOS 代码。