Flutter之路由

目录

  • 组件 - 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

  • 在配置文件pubspec.yaml中添加第三方路由库,fluro(https://github.com/theyakka/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之路由)