什么是Router
Android中,页面对应的是Activity,在iOS中是ViewController。而在Flutter中,页面只是一个widget,是Router。Route 在Android 中通常指一个 Activity ,在 iOS 中指一个 ViewController
MaterialPageRoute
官方解释
MaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面,它还定义了路由构建及切换时过渡动画的相关接口及属性。MaterialPageRoute 是Material组件库提供的组件,它可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画:
当打开页面时,新的页面会从屏幕右侧边缘一致滑动到屏幕左边,直到新页面全部显示到屏幕上,而上一个页面则会从当前屏幕滑动到屏幕左侧而消失;当关闭页面时,正好相反,当前页面会从屏幕右侧滑出,同时上一个页面会从屏幕左侧滑入。
构造方法
参数说明
- builder 是一个WidgetBuilder类型的回调函数,它的作用是构建路由页面的具体内容,返回值是一个widget。我们通常要实现此回调,返回新路由的实例。
- settings 包含路由的配置信息,如路由名称、路由参数、是否初始路由(首页)。
- maintainState:默认情况下,当入栈一个新路由时,原来的路由仍然会被保存在内存中,如果想在路由没用的时候释放其所占用的所有资源,可以设置maintainState为false
- fullscreenDialog表示新的路由页面是否是一个全屏的模态对话框,在iOS中,如果fullscreenDialog为true,新页面将会从屏幕底部滑入(而不是水平方向)
- transitionDuration 页面过渡时间
CupertinoPageRoute和 MaterialPageRoute 源码逻辑一样。
Navigator
作用:管理理由(router)
我们一般都是通过Navigator.of(context)来获取NavigatorState对象,然后通过NavigatorState对象中的函数来实现页面跳转、关闭、替换等
- push 将设置的router信息推送到Navigator上,实现页面跳转。
//void _openMyPage() {
// Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => MyPage()));
// }
Navigator.push(BuildContext context, Route<T> route)
可以将当前页面转换成Router,压入由Navigator管理的路由堆栈(the stack of routes)中。可以在then()拿到页面回掉的值。
- of 主要是获取 Navigator最近实例的好状态。
rootNavigator为true表示获取根Navigator,否则获取距离当前Widget最近的Navigator,默认为false。
可以发现,这里要想获取根Navigator,就需要传递一个context对象,但在某些需求(如token失效跳转登录页)下,无法拿到context对象,但又需要跳转,那这该怎么办?
这时候我们可以给根Navigator传递一个key,然后根据这个key拿到NavigatorState对象。而MaterialApp又给我们提供了向根Navigator传递key的机会
class MaterialApp extends StatefulWidget {
const MaterialApp({
Key key,
//自定义key
this.navigatorKey,
...
})
}
通过给navigatorKey赋一个GlobalKey对象,然后通过这个对象就可以不需要context来获得根Navigator,从而进行页面的跳转、返回、替换等。
- pop 导航到新页面,或者返回到上个页面。
- canPop 判断是否可以导航到新页面
- maybePop 可能会导航到新页面。maybePop可以理解为canPop的升级版,canPop只用来判断页面是否可以被pop。而maybePop则对此进行了升级——如果可以pop则直接pop,否则什么都不做。
- popAndPushNamed 指定一个路由路径,并导航到新页面。
- popUntil 反复执行pop 直到该函数的参数predicate返回true为止。
- pushAndRemoveUntil 将给定路由推送到Navigator,删除先前- 的路由,直到该函数的参数predicate返回true为止。
- pushNamed 将命名路由推送到Navigator。
- pushNamedAndRemoveUntil 将命名路由推送到Navigator,- 删除先前的路由,直到该函数的参数predicate返回true为止。
- pushReplacement 路由替换。
- pushReplacementNamed 这个也是替换路由操作。推送一个命名路由到Navigator,新路由完成动画之后处理上一个路由。
- removeRoute 从Navigator中删除路由,同时执行Route.dispose操作。
- removeRouteBelow 从Navigator中删除路由,同时执行Route.dispose操作,要替换的路由是传入参数anchorRouter里面的路由。
- replace 将Navigator中的路由替换成一个新路由。
- replaceRouteBelow 将Navigator中的路由替换成一个新路由,要替换的路由是是传入参数anchorRouter里面的路由。