【Flutter】三十一、Flutter路由

Flutter中使用Navigator可以完成路由的路由的跳转。

一、Navigator

1.1 Navigator的使用

  • 首先创建两个页面:
    main.dart
void main() => runApp(MyApp());
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter demo')
        ),
        body: RouteDemo(),
      ),
    );
  }
}

class RouteDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Center(
      child: RaisedButton(
        child: Text('打开新的路由'),
        onPressed: () {},
      ),
    );
  }
}

page.dart:

import 'package:flutter/material.dart';

class PageRouteDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('pageRoute'),
        leading: IconButton(
            icon: Icon(Icons.arrow_back),
            onPressed: () {
            }),
      ),
      body: Center(
        child: Text('pageRoute'),
      ),
    );
  }
}
  • 要实现从main.dart跳转至page.dart,需借助Navigator,现在对main.dart中的按钮点击事件中添加如下代码:
// 页面入栈
Navigator.push(context, MaterialPageRoute(
	builder: (context) => PageRouteDemo()));
  • 现在点击按钮,就可以跳转到page.dart页面了,但是我们点击page.dart上方的返回按钮是没有反应的,此时我们在page.dart中的返回图标中添加点击事件:
// 页面出栈
Navigator.pop(context);

在这里插入图片描述

1.2 使用Navigator传递参数

    在页面跳转时,难免会传递一些参数,那么使用Navigator怎样传递参数呢。这里有两种方法,其中一种是通过PageRouteDemo的构造函数传递,另一种是通过设置MaterialPageRoute中的settings属性。:

import 'package:flutter/material.dart';

class PageRouteDemo extends StatelessWidget {
  String param;
  PageRouteDemo({this.param});
  
  @override
  Widget build(BuildContext context) {
  	// 获取来自settings属性的数据
  	Map map = ModalRoute.of(context).settings.arguments;
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('pageRoute'),
        leading: IconButton(
            icon: Icon(Icons.arrow_back),
            onPressed: () {
              Navigator.pop(context);
            }),
      ),
      body: Center(
        child: Text('通过构造函数传递: $param;settings参数传递:${map["id"]}'),
      ),
    );
  }
}
Navigator.push(context, MaterialPageRoute(
	builder: (context) => PageRouteDemo('来自上个页面的数据'),
	settings: RouteSettings(arguments: {"id": 2123})
));

    在调用Navigator.push时直接将参数传入PageRouteDemo构造函数当中即可。那么如果是返回的时候要传递数据呢?其实Navigator.pop是可以传入第二个参数,这个参数就是当前页面要返回给上一个页面的数据,然后在上个页面使用Navigator.push接受这个数据。

Navigator.pop(context, '页面返回时传递的数据');

main.dart中接受数据:

	RaisedButton(
        child: Text('打开新的路由'),
        onPressed: () async {
          String result = await Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => PageRouteDemo(param:'来自上个页面的数据'),
                  // fullscreenDialog: false,
                  settings: RouteSettings()));
          if (result != null) {
            Scaffold.of(context).showSnackBar(SnackBar(
              content: Text(result),
            ));
          }
        },
      ),

在这里插入图片描述

二、MaterialPageRoute

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

  • Andriod:当打开新页面时,页面会从底部滑动到顶部。
  • iOS:当打开新页面时,页面会从右侧滑动进入屏幕。

2.1 MaterialPageRoute构造函数

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

三、命名路由

    通过MaterialApp中的routes属性注册一个路由表,调用Navigator.pushNamed方法指定要跳转的路由,同样可以实现页面跳转。示例代码如下:

void main() => runApp(MyApp());
class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        '/page': (context) => PageRouteDemo()
      },
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter demo')
        ),
        body: RouteDemo(),
      ),
    );
  }
}

class RouteDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Center(
      child: RaisedButton(
        child: Text('打开新的路由'),
        onPressed: () {
          Navigator.pushNamed(context, '/page', arguments: {'id': 324});
        },
      ),
    );
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MAXLZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值