flutter 中Route

什么是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里面的路由。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter,使用Fluro库实现带参数的路由非常简单。首先,你需要在route_handlers.dart文件定义一个处理函数,该函数接收参数并返回相应的界面。在这个函数,你可以使用路由参数来获取传递的参数值。例如,在你的代码,settingHandler是一个处理函数,它接收一个BuildContext对象和一个Map<String, List<String>>类型的参数params,并从params获取'id'参数的值args。然后,你可以使用该参数值来创建一个Setting界面的实例,并返回该实例。这样,当Fluro路由系统匹配到"/setting"路由时,它会调用settingHandler处理函数并传递参数。 接着,在route.dart文件,你需要配置路由并将路由与对应的处理函数关联起来。你可以使用FluroRouter的define方法来注册路由,并使用handler参数指定对应的处理函数。在你的代码,Routes类的configureRoutes方法使用了router.define方法注册了"/setting"路由,并将settingHandler作为其处理函数。这样,当导航器导航到"/setting"路由时,Fluro路由系统会调用settingHandler处理函数来处理该路由。 总结起来,要实现Flutter Fluro带参数的路由,你需要在route_handlers.dart定义处理函数,接收参数并返回相应的界面实例。然后,在route.dart配置路由并将路由与对应的处理函数关联起来。这样,当导航器匹配到相应的路由时,Fluro路由系统会调用处理函数并传递参数,从而实现带参数的路由导航。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值