Flutter命名路由跳转页面及传值

25 篇文章 0 订阅
8 篇文章 0 订阅

这篇文章说一下命名路由跳转页面和传值的方式,目录结构就不贴了,在上一篇文章里就有,直接上代码

首先实现以下在分类页面点击按钮跳转到分类详情页面

这里需要注意,配置命名路由需要在main.dart,入口文件里配置,或者单独配置成一个文件然后在main.dart里调用也可以

//main.dart
import 'package:flutter/material.dart';

import 'pages/mine.dart';
import 'pages/type.dart';
import 'pages/Tabs.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeContent(),
      //这里配置路由名称,后面需要跳转页面的地方跟这个地方的名称对应上就行
      routes: {
        "/form" : (context) => TypePage(),
      },
    );
  }
}

//Category.dart
import 'package:flutter/material.dart';

class CategoryPage extends StatefulWidget {
  CategoryPage({Key key}) : super(key: key);
  _CategoryPageState createState() => _CategoryPageState();
}

class _CategoryPageState extends State<CategoryPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
        title: Text("分类"),
      ) ,
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
              child: Text("跳转到分类页面"),
              onPressed: () {
                //普通路由跳转并传值
                Navigator.pushNamed(context, "/form");  //此处实现了跳转到Type.dart页面
              },
              color: Theme.of(context).accentColor,
              textTheme: ButtonTextTheme.primary
          ),
          SizedBox(height: 20),
        ],
      )
    );
  }
}

下面实现命名路由跳转页面并传值,在Myself页面点击按钮跳转到Mine页面,并传递一个参数

//main.dart
import 'package:flutter/material.dart';

import 'pages/mine.dart';
import 'pages/type.dart';
import 'pages/Tabs.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  //统一配置路由,并传递可选参数arguments
  final routes = {
    "/mine" : (context, {arguments}) => MinePage(arguments : arguments)
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeContent(),
      onGenerateRoute: (RouteSettings settings) {
        final String name = settings.name;   //路由的名称
        print(name);   //打印之后就是——/mine
        final Function pageContentBuilder = this.routes[name];   //名称对应的页面
        print(pageContentBuilder);   //打印后就是——MinePage
        //此处是固定写法,判断pageContentBuilder和settings是否为空
        if (pageContentBuilder != null) {
          if (settings.arguments != null) {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContentBuilder(context, arguments: settings.arguments)
            );
            return route;
          } else {
            final Route route = MaterialPageRoute(
                builder: (context) => pageContentBuilder(context)
            );
            return route;
          }
        }
      },
    );
  }
}

//Myself.dart
import 'package:flutter/material.dart';

class MyselfPage extends StatefulWidget {
  MyselfPage({Key key}) : super(key: key);
  _MyselfPageState createState() => _MyselfPageState();
}

class _MyselfPageState extends State<MyselfPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
        title: Text("个人中心"),
      ) ,
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
              child: Text("个人中心页面"),
              onPressed: () {
                //普通路由跳转并传值,此处arguments里就是定义要传的值
                Navigator.pushNamed(context, "/mine", arguments: {
                  "id" : 123
                });
              },
              color: Theme.of(context).accentColor,
              textTheme: ButtonTextTheme.primary
          ),
          SizedBox(height: 20),
        ],
      ),
    );
  }
}

//Mine.dart
import 'package:flutter/material.dart';

class MinePage extends StatelessWidget {
  //这里定义arguments常量来接收上一个页面的传值
  final arguments;
  MinePage({this.arguments});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
        title: Text("个人中心新页面"),
      ) ,
      //如果上一个页面定义了arguments值,那么跳转后的页面显示的就是传递的id的值,否则显示0
      body: Text("${arguments != null ? arguments["id"] : '0'}"),
    );
  }
}

对于写项目的话,感觉还是对路由统一管理比较好,这样每创建一个页面需要跳转的话只需要在路由里多配置一条就好了,下面来实现一下,新建一个文件Routes.dart用来配置所有的路由和,刚进程序时加载的路由,目录结构

//main.dart
import 'package:flutter/material.dart';

import 'routes/Routes.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: "/",   //初始化时加载的路由
      onGenerateRoute: onGenerateRoute
    );
  }
}

//Routes.dart
import 'package:flutter/material.dart';

import '../pages/Mine.dart';
import '../pages/Search.dart';
import '../pages/Settings.dart';
import '../pages/Tabs.dart';
import '../pages/type.dart';

final routes = {
  "/" :(context) => HomeContent(),   //初始化时加载的路由
  "/mine" : (context, {arguments}) => MinePage(arguments : arguments),
  "/search" : (context) => SearchPage(),
  "/setting" : (context) => SettingsPage(),
  "/type" : (context) => TypePage(),
};

var onGenerateRoute = (RouteSettings settings) {
  final String name = settings.name;
  final Function pageContentBuilder = routes[name];
  if (pageContentBuilder != null) {
    if (settings.arguments != null) {
      final Route route = MaterialPageRoute(
        builder: (context) => pageContentBuilder(context, arguments: settings.arguments)
      );
      return route;
    } else {
      final Route route = MaterialPageRoute(
        builder: (context) => pageContentBuilder(context)
      );
      return route;
    }
  }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值