Flutter之路由

路由

路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewController。

路由管理其实也就是管理页面之间如何跳转,通常也可被称为导航管理。

//新建一个路由(页面):
class NewRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("New route"),
      ),
      body: Center(
        child: Text("This is new route"),
      ),
    );
  }
}

//扩展HolleWord 工程
//在Column的子widget中添加一个按钮(FlatButton) 
Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
      ... //省略无关代码
      FlatButton(
         child: Text("open new route"),
         textColor: Colors.blue,
         onPressed: () {
          //导航到新路由   
          Navigator.push( context,
           new MaterialPageRoute(builder: (context) {
                  return new NewRoute();
             }));
          },
         ),
       ],
 )

MaterialPageRoute

MaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面,它还定义了路由构建及切换时过渡动画的相关接口及属性。MaterialPageRoute 是Material组件库的一个Widget,它可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画。

iOS 从右往左
Android 从下往上

研究一下 MaterialPageRoute:

MaterialPageRoute({
    WidgetBuilder builder,
    RouteSettings settings,
    bool maintainState = true,
    bool fullscreenDialog = false,
  })
  1. builder 是一个WidgetBuilder类型的回调函数,它的作用是构建路由页面的具体内容,返回值是一个widget。我们通常要实现此回调,返回新路由的实例。
  2. settings 包含路由的配置信息,如路由名称、是否初始路由(首页)。
  3. maintainState:默认情况下,当入栈一个新路由时,原来的路由仍然会被保存在内存中,如果想在路由没用的时候释放其所占用的所有资源,可以设置maintainState为false。
  4. fullscreenDialog表示新的路由页面是否是一个全屏的模态对话框,在iOS中,如果fullscreenDialog为true,新页面将会从屏幕底部滑入(而不是水平方向)。

Navigatior

Navigator类中第一个参数为context的静态方法都对应一个Navigator的实例方法, 比如:

Navigator.push(BuildContext context, Route route) 等价于 Navigator.of(context).push(Route route) ,

下面命名路由相关的方法也是一样的。

路由表

要想使用命名路由,我们必须先提供并注册一个路由表(routing table),这样应用程序才知道哪个名称与哪个路由Widget对应。路由表的定义如下:

Map<String, WidgetBuilder> routes;

它是一个Map, key 为路由的名称,是个字符串;value是个builder回调函数,用于生成相应的路由Widget。我们在通过路由名称入栈新路由时,应用会根据路由名称在路由表中找到对应的WidgetBuilder回调函数,然后调用该回调函数生成路由widget并返回。

  1. 注册路由表:
    在main 中找到MaterialApp,添加routes属性:
return new MaterialApp(
  title: 'Flutter Demo',
  theme: new ThemeData(
    primarySwatch: Colors.blue,
  ),
  //注册路由表
  routes:{
   "new_page":(context)=>NewRoute(),
  } ,
  home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
  1. 调用
onPressed: () {
  Navigator.pushNamed(context, "new_page");
  //Navigator.push(context,
  //  new MaterialPageRoute(builder: (context) {
  //  return new NewRoute();
  //}));  
},

路由跳转传递参数

//发送参数
Navigator.of(context).pushNamed("new_page", arguments: "hi");
class EchoRoute extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    //获取路由参数  
    var args=ModalRoute.of(context).settings.arguments
    //...省略无关代码
  }
}

参考:https://book.flutterchina.club/chapter2/flutter_router.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 版权声明:本文为博主原创文章,转载请注明出处! 时隔许久,继之前发的Flutter入门(环境配置)文章之后,终于有...
    Yinll阅读 13,272评论 8赞 17
  • 前言 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接...
    静默加载阅读 10,457评论 0赞 1
  • Flutter的设计貌似对前端同学比较友好,言归正传,先从原理开始,然后是具体的case,好,我们开始: 小提示:...
    白袍君阅读 1,555评论 0赞 2
  • Router 路由(页面跳转) MaterialPageRoute构造函数 MaterialPageRoute M...
    elviswong_china阅读 2,277评论 0赞 0
  • 七律/大鹤望兰 作者/心博、图片:网络 阔叶如同蒲扇扬,枝栖大鹤翅开张。 欲知此鸟来何处,或谓前生侍上皇。 可是乘...
    心博1阅读 476评论 0赞 2

友情链接更多精彩内容