导航
导航
如何在两个页面之间切换?
在 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 代码。
