不传递参数的命名路由:

    1. import 'package:flutter/material.dart';
    2. // 创建页面
    3. import './tabs/tabs.dart';
    4. import './pages/home.dart';
    5. import './pages/search.dart';
    6. import './pages/detail.dart';
    7. import './pages/me.dart';
    8. void main() => runApp(MyApp());
    9. class MyApp extends StatelessWidget {
    10. @override
    11. Widget build(BuildContext context) {
    12. return MaterialApp(
    13. title: 'Retrieve Text Input',
    14. home: MyBottomNavigationBar(),
    15. // 定义路由
    16. routes: {
    17. '/home': (context) => HomePage(),
    18. '/search': (context) => SearchPage(),
    19. '/detail': (context) => DetailPage(),
    20. '/me': (context) => MePage(),
    21. },
    22. );
    23. }
    24. }
    25. // 例子: home.dart 页面
    26. import 'package:flutter/material.dart';
    27. class HomePage extends StatefulWidget {
    28. @override
    29. _HomePageState createState() => _HomePageState();
    30. }
    31. class _HomePageState extends State<HomePage> {
    32. @override
    33. Widget build(BuildContext context) {
    34. return Center(
    35. child: ElevatedButton(
    36. child: Text('跳转到详情页面'),
    37. onPressed: () {
    38. // 由于我们在全局定义了路由, 所以这里可以直接使用, 而不需要想普通路由那样,引入需要跳转的页面
    39. Navigator.pushNamed(context, '/detail');
    40. },
    41. ),
    42. );
    43. }
    44. }

    传递参数的命名路由:

    1. import 'package:flutter/material.dart';
    2. import './tabs/tabs.dart';
    3. import './pages/home.dart';
    4. import './pages/search.dart';
    5. import './pages/detail.dart';
    6. import './pages/me.dart';
    7. void main() => runApp(MyApp());
    8. class MyApp extends StatelessWidget {
    9. final Map routes = {
    10. '/home': (context) => HomePage(),
    11. '/search': (context) => SearchPage(),
    12. '/detail': (context, { arguments }) => DetailPage(arguments: arguments),
    13. '/me': (context, { arguments }) => MePage(arguments: arguments),
    14. };
    15. @override
    16. Widget build(BuildContext context) {
    17. return MaterialApp(
    18. title: 'Retrieve Text Input',
    19. home: MyBottomNavigationBar(),
    20. // 固定写法, 可以在任意的命名路由中传递参数
    21. onGenerateRoute: (RouteSettings settings) {
    22. // 获取路由名称
    23. final String name = settings.name;
    24. // 获取路由
    25. final Function pageContentBuilder = this.routes[name];
    26. if(pageContentBuilder != null) {
    27. // 判读是否有 参数 , 注意, 这个参数命名 arguments , 你可以另取名称
    28. if(settings.arguments != null) {
    29. // 传递参数
    30. final Route route = MaterialPageRoute(
    31. // 命名参数传递
    32. builder: (context) => pageContentBuilder(context , arguments: settings.arguments),
    33. );
    34. return route;
    35. } else {
    36. final Route route = MaterialPageRoute(
    37. builder: (context) => pageContentBuilder(context),
    38. );
    39. return route;
    40. }
    41. }
    42. },
    43. );
    44. }
    45. }
    46. // home.dart 传递参数
    47. import 'package:flutter/material.dart';
    48. class HomePage extends StatefulWidget {
    49. @override
    50. _HomePageState createState() => _HomePageState();
    51. }
    52. class _HomePageState extends State<HomePage> {
    53. @override
    54. Widget build(BuildContext context) {
    55. return Center(
    56. child: ElevatedButton(
    57. child: Text('跳转到详情页面'),
    58. onPressed: () {
    59. // 传递参数, 注意 因为你的参数命名为 arguments , 所以这里要统一,并携带你需要的参数
    60. Navigator.pushNamed(context, '/detail', arguments: { "id": 123 });
    61. },
    62. ),
    63. );
    64. }
    65. }
    66. //detail.dart 接受参数
    67. import 'package:flutter/material.dart';
    68. class DetailPage extends StatelessWidget {
    69. // 构造函数内接受参数
    70. DetailPage({this.arguments});
    71. final arguments;
    72. @override
    73. Widget build(BuildContext context) {
    74. return Scaffold(
    75. appBar: AppBar(
    76. title: Text('详情页面'),
    77. ),
    78. body: Center(
    79. // 读取获取到的 id
    80. child: Text("详情页面${arguments['id']}"),
    81. ),
    82. );
    83. }
    84. }

    router 封装:

    1. // 把所有的路由统一一个文件管理起来
    2. import 'package:flutter/material.dart';
    3. import '../pages/Tabs.dart';
    4. import '../pages/home.dart';
    5. import '../pages/search.dart';
    6. import '../pages/detail.dart';
    7. import '../pages/me.dart';
    8. final routes = {
    9. '/': (context) => MyBottomNavigationBar(),
    10. '/home': (context) => HomePage(),
    11. '/search': (context) => SearchPage(),
    12. '/detail': (context, {arguments}) => DetailPage(arguments: arguments),
    13. '/me': (context, {arguments}) => MePage(arguments: arguments),
    14. };
    15. //固定写法
    16. var onGenerateRoute = (RouteSettings settings) {
    17. // 统一处理
    18. final String name = settings.name;
    19. final Function pageContentBuilder = routes[name];
    20. if (pageContentBuilder != null) {
    21. if (settings.arguments != null) {
    22. final Route route = MaterialPageRoute(
    23. builder: (context) =>
    24. pageContentBuilder(context, arguments: settings.arguments));
    25. return route;
    26. } else {
    27. final Route route =
    28. MaterialPageRoute(builder: (context) => pageContentBuilder(context));
    29. return route;
    30. }
    31. }
    32. };
    33. // 在main.dart 中引用这个文件
    34. import 'package:flutter/material.dart';
    35. import 'routes/routes.dart'; // 引入刚刚封装好的路由文件
    36. void main() => runApp(MyApp());
    37. class MyApp extends StatelessWidget {
    38. @override
    39. Widget build(BuildContext context) {
    40. return MaterialApp(
    41. title: 'Retrieve Text Input',
    42. // home: MyBottomNavigationBar(), 初始化的时候默认加载后 这个方式可以注释掉了
    43. initialRoute: '/', // 初始化的时候加载的路由
    44. onGenerateRoute: onGenerateRoute, // 使用这个命名路由传参的方法
    45. );
    46. }
    47. }