Flutter路由跳转及参数传递

作者: Brant白叔 | 来源:发表于2018-04-24 13:35 被阅读297次
    image

    本文要介绍的知识点

    • 用路由推出一个新页面
    • 打开新页面时,传入参数
    • 参数的回传

    路由

    做Android/iOS原生开发的时候,要打开一个新的页面,你得知道你的目标页面对象,然后初始化一个Intent或者ViewController,再通过startActivity或者pushViewController来推出一个新的页面,不能跟web一样,直接丢一个链接地址就跳转到新的页面。当然,可以自己去加一个中间层来实现这些功能。
    Flutter里面是原生支持路由的。Flutter的framework提供了路由跳转的实现。我们可以直接使用这些功能。

    Flutter路由介绍

    Flutter里面有路由支持所有的路由场景,push、pop页面,页面间的参数传递等等。flutter里面的路由可以分成两种,一种是直接注册,不能传递参数。另一种要自己构造实例,可以传递参数。我们暂时把它们规为静态路由和动态路由。

    静态路由的注册

    在新建一个MD风格的App的时候,可以传入一个routes参数来定义路由。但是这里定义的路由是静态的,它不可以向下一个页面传递参数。

    return new MaterialApp(
          title: 'Flutter Demo',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new MyHomePage(title: 'Flutter实例'),
          routes: <String, WidgetBuilder> {
            // 这里可以定义静态路由,不能传递参数
            '/router/second': (_) => new SecondPage(),
            '/router/home': (_) => new RouterHomePage(),
          },
        );
    

    静态路由的使用

    push一个新页面,pushNamed方法是有一个Future的返回值的,所以静态路由也是可以接收下一个页面的返回值的。但是不能向下一个页面传递参数。

    Navigator.of(context).pushNamed('/router/second');
    
    // 带返回值
    Navigator.of(context).pushNamed('/router/second').then((value) {
                        // dialog显示返回值
                        _showDialog(context, value);
                      })
    

    pop回上一个页面

    Navigator.of(context).pop('这个是要返回给上一个页面的数据');
    

    动态路由的使用

    当需要向下一个页面传递参数时,要用到所谓的动态路由,自己生成页面对象,所以可以传递自己想要的参数。

    Navigator.of(context).push(new MaterialPageRoute(builder: (_) {
                        return new SecondPage(title: '路由是个好东西,要进一步封装');
                      }));
    

    也可以用PageRouterBuilder来自定义打开动画

    Navigator.of(context).push(new PageRouteBuilder(pageBuilder:
                (BuildContext context, Animation<double> animation,
                    Animation<double> secondaryAnimation) {
              return new RefreshIndicatorDemo();
            }, transitionsBuilder: (
              BuildContext context,
              Animation<double> animation,
              Animation<double> secondaryAnimation,
              Widget child,
            ) {
              // 添加一个平移动画
              return BRouter.createTransition(animation, child);
            }));
    

    平移的变换

    /// 创建一个平移变换
      /// 跳转过去查看源代码,可以看到有各种各样定义好的变换
      static SlideTransition createTransition(
          Animation<double> animation, Widget child) {
        return new SlideTransition(
          position: new Tween<Offset>(
            begin: const Offset(1.0, 0.0),
            end: const Offset(0.0, 0.0),
          ).animate(animation),
          child: child, // child is the value returned by pageBuilder
        );
      }
    

    关于学习

    flutter的学习文章都整理在这个github仓库

    相关文章

      网友评论

      本文标题:Flutter路由跳转及参数传递

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