美文网首页
Flutter之路由

Flutter之路由

作者: IsYang | 来源:发表于2019-10-15 18:11 被阅读0次

    目录

    • 组件 - BottomAppBar
    • 手势控制 - GestureDetector
    • 路由概述
    • 构建路由
    • 命名路由
    • 路由库 - fluro

    1. 组件-BottomAppBar

    我们可以通过Scaffold的bottomNavigationBar属性来设置底部导航,通过Material组件库提供的BottomNavigationBar和BottomNavigationBarItem两种组件来实现Material风格的底部导航栏。

    属性 说明
    BottomNavigationBarItem 多个菜单项
    currentIndex 当前页面索引
    iconSize 图标大小
    type 导航底部的类型
    onTap() 点击选中时函数

    2. 手势控制-GestureDetector

    GestureDetector是一个用于手势识别的功能性组件,我们通过它可以来识别各种手势。像按钮,ListView等一些组件都是具有点击事件的,但是还有一些组件是不具备点击事件的,这时我们就可以用到GestureDetector来监听当前组件的事件行为。

    示例代码如下:

                 child: GestureDetector(
                   child: Text(
                     item['title'],
                     maxLines: 1,
                     overflow: TextOverflow.ellipsis,
                     style: TextStyle(
                       fontSize: 20.0
                     ),
                   ),
                   // 单击事件
                   onTap: () {
                     Navigator.push(context,
                         MaterialPageRoute(builder: (context) {
                             return DetailPage(item['title']);
                         })
                     );
                   },
                 // onLongPress 长按事件
                 // onDoubleTap 双击事件
                 ),
    

    GestureDetector里面还有很多事件,可自行查文档。

    3. 路由概述

    路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewController。所谓路由管理,就是管理页面之间如何跳转,通常也可被称为导航管理。Flutter中的路由管理和原生开发类似,无论是Android还是iOS,导航管理都会维护一个路由栈,路由入栈(push)操作对应打开一个新页面,路由出栈(pop)操作对应页面关闭操作,而路由管理主要是指如何来管理路由栈。


    4. 构建路由

    4.1 MaterialPageRoute

    MaterialPageRoute 是Material组件库提供的组件,它可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画

    属性 说明
    builder 构建路由页面的具体内容,返回值是一个widget。
    settings 路由的配置信息,如路由名称、是否初始路由(首页)
    maintainState 是否释放其所占用的所有资源

    4.2 页面跳转-Navigator

    Navigator是一个路由管理的组件,它提供了打开和退出路由页方法。Navigator通过一个栈来管理活动路由集合。通常当前屏幕显示的页面就是栈顶的路由。

    以下是常用的两个方法:

    方法 说明
    push(BuildContext context, Route route) 打开新的页面 。
    pop(BuildContext context, [ result ]) 退出当前页面,result 为页面关闭时返回给上一个页面的数据。

    Navigator.push(BuildContext context, Route route)等价于Navigator.of(context).push(Route route),还有很多其他的方法,可查API文档。

    跳转到新路由,代码如下:
    创建一个A页面,在B页面中引入A页面文件。

    class APage extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
       return Scaffold(
         appBar: AppBar(
           title: Text("New route"),
         ),
         body: Center(
           child: Text("This is new route"),
         ),
       );
     }
    }
    
    import 'APage.dart'
    // ...省略其他代码
    Navigator.push( context,
         MaterialPageRoute(builder: (context) {
              return APage();
         }));
    },
    

    4.3 路由传值

    // ...省略其他代码
    onPressed: () {
        Navigator.push(context,
                MaterialPageRoute(builder: (context) {
                        return DetailPage("1");
                })
          );
    },
    

    在打开的页面接收参数值,代码示例如下:

    class APage extends StatelessWidget {
     final String id;
     DetailPage(this.id);
    
     @override
     Widget build(BuildContext context) {
       return Scaffold(
         appBar: AppBar(
           title: Text("New route"),
         ),
         body: Center(
           child: Text(${this.id}),
         ),
       );
     }
    }
    

    关闭当前路由时,传递参数值,具体代码如下:

     RaisedButton(
            onPressed: () => Navigator.pop(context, "我是返回值"),
            child: Text("返回"),
    )
    

    5. 命名路由

    所谓“命名路由”(Named Route)即有名字的路由,我们可以先给路由起一个名字,然后就可以通过路由名字直接打开新的路由了,这为路由管理带来了一种直观、简单的方式。

    5.1注册路由表

    // 导入相关组件,loginpage, listpage, navbar
    
      MaterialApp(
          title: 'Flutter 路由',
          initialRoute: "/login",  // 初始路由
          // 注册路由表
          routes: {
            '/': (BuildContext context) => Navbar(),
            "/home": (BuildContext context) => new Navbar(),
            '/list': (BuildContext context) => new ListPage(),
            '/login': (BuildContext context) =>  LoginPage()
          },
        );
    

    5.2通过路由名打开新路由页

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

    5.3 命名路由参数传递

    代码示例如下:

    Navigator.of(context).pushNamed('/home', arguments: '公司名称: ${data['data']['area']['fullName']}');
    

    获取路由参数

        var args=ModalRoute.of(context).settings.arguments
    

    5.4 onGenerateRoute

    MaterialApp有一个onGenerateRoute属性,它在打开命名路由时可能会被调用,有了onGenerateRoute回调,控制页面权限的功能就非常容易, 如果指定的路由名在路由表中已注册,则会调用路由表中的builder函数来生成路由组件;如果路由表中没有注册,才会调用onGenerateRoute来生成路

    代码如下:

    MaterialApp(
      ... //省略无关代码
      onGenerateRoute:(RouteSettings settings){
          return MaterialPageRoute(builder: (context){
               String routeName = settings.name;
           // 如果访问的路由页需要登录,但当前未登录,则直接返回登录页路由,
           // 引导用户登录;其它情况则正常打开路由。
         }
       );
      }
    );
    
    

    6. 路由库 - fluro

    dependencies
        fluro: ^1.5.1
    

    或者也可以直接引用git链接

    dependencies
        fluro:
           git: git://github.com/theyakka/fluro.git
    

    保存配置文件即可,或者运行flutter packages upgrade就安装成功啦。



    小插曲:

    安卓打包命令:flutter build apk ;
    打包出来生成的文件目录在项目下/build/app/outputs/apk/release

    ios打包命令: flutter build ios

    相关文章

      网友评论

          本文标题:Flutter之路由

          本文链接:https://www.haomeiwen.com/subject/womupctx.html