当前位置:   article > 正文

flutter路由跳转

flutter路由跳转

Navigator.of(context).push(); //路由跳转(模块方式)

  1. Navigator.of(context).push(MaterialPageRoute(
  2. builder: (BuildContext context) {
  3. return const Page() ;//Page()指页面
  4. },
  5. ))

Navigator.pushNamed(context, "/") //路由跳转(路由方式)

Navigator.pop(context)//返回上级

路由对象  widget

获取/使用路由参数 (widget.id / widget.title)     使用${widget.title}

1.基本路由

button按钮点击跳转示例(传参)

  1. //button按钮点击事件
  2. //在button页面内引入Page
  3. //import './page.dart';
  4. IconButton(
  5. onPressed: () => {
  6. Navigator.of(context).push(
  7. MaterialPageRoute(builder: (BuildContext context)=>const PageWidget(title:'小刀刀',id:12);)
  8. )
  9. },
  10. icon: const Icon(Icons.keyboard_arrow_right), //设置图标
  11. )
  12. //page页面
  13. import 'package:flutter/material.dart';
  14. class PageWidget extends StatefulWidget {
  15. final String title;
  16. final int id;
  17. const PageWidget({super.key, this.title = "我是系统设置", required this.id});
  18. @override
  19. State<PageWidget> createState() => _PageWidgetState();
  20. }
  21. class _PageWidgetState extends State<PageWidget> {
  22. String str = '';
  23. @override
  24. void initState() {
  25. super.initState();
  26. //根据传递的id参数, 格式化数据
  27. str = "传递参数为${widget.id}";
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. return Scaffold(
  32. floatingActionButton: FloatingActionButton(
  33. onPressed: () => Navigator.pop(context),
  34. child: const Icon(Icons.arrow_left_outlined),
  35. ),
  36. appBar: AppBar(
  37. title: const Text("路由传参"),
  38. centerTitle: true,
  39. ),
  40. body: Center(
  41. child: Text("${widget.title}:$str",
  42. style: const TextStyle(color: Colors.pink))),
  43. );
  44. }
  45. }

2.命名路由-不携带参数

Navigator.pushNamed(context, "/") //路由跳转(路由方式)

在main.dart的MaterialApp的routes中配置整体路由 格式routes:{key:()=>Widget(),....}

initialRoute默认路由

  1. //main.dart
  2. void main() {
  3. runApp(MaterialApp(title: 'contaniner', initialRoute: "/", routes: {
  4. "/": (context) => const HomeWidget(),
  5. "/page": (context) => const PageWidget(),
  6. }));
  7. }
  8. //home.dart
  9. import 'package:flutter/material.dart';
  10. class HomeWidget extends StatefulWidget {
  11. const HomeWidget({super.key});
  12. @override
  13. State<HomeWidget> createState() => _HomeWidgetState();
  14. }
  15. class _HomeWidgetState extends State<HomeWidget> {
  16. @override
  17. Widget build(BuildContext context) {
  18. return Scaffold(
  19. appBar: AppBar(
  20. title: const Text("首页"),
  21. centerTitle: true,
  22. ),
  23. body: ElevatedButton(
  24. onPressed: () => Navigator.pushNamed(context, "/page"),
  25. child: const Text("我是命名路由"),
  26. ),
  27. );
  28. }
  29. }
  30. //page页面
  31. import 'package:flutter/material.dart';
  32. class PageWidget extends StatefulWidget {
  33. const PageWidget({super.key});
  34. @override
  35. State<PageWidget> createState() => _PageWidgetState();
  36. }
  37. class _PageWidgetState extends State<PageWidget> {
  38. @override
  39. Widget build(BuildContext context) {
  40. return Scaffold(
  41. floatingActionButton: FloatingActionButton(
  42. onPressed: () => Navigator.pop(context),
  43. child: const Icon(Icons.arrow_left_outlined),
  44. ),
  45. appBar: AppBar(
  46. title: const Text("命名路由"),
  47. centerTitle: true,
  48. ),
  49. body: Center(
  50. child: Text("我是Page页面")),
  51. );
  52. }
  53. }

3.命名路由-传参

注意点:

A.创建路由Map

B.main.dart的MaterialApp添加onGenerateRoute

C.接收使用参数:

final Map arguments;

const PageWidget({super.key, required this.arguments });

print(widget.arguments);

  1. //main.dart
  2. import 'package:flutter/material.dart';
  3. import './router/page.dart';
  4. import './router/home.dart';
  5. void main() {
  6. runApp(MyApp());
  7. }
  8. class MyApp extends StatelessWidget {
  9. const MyApp({super.key});
  10. @override
  11. Widget build(BuildContext context) {
  12. final Map _routerMap = {
  13. "/": (context) => HomeWidget(),
  14. "/page": (context, {arguments}) => PageWidget(arguments: arguments),
  15. };
  16. return MaterialApp(
  17. title: 'contaniner',
  18. initialRoute: "/",
  19. onGenerateRoute: (RouteSettings settings) {
  20. //settings.name 路由地址
  21. //settings.arguments 携带参数
  22. // 统一处理
  23. final String? name = settings.name;
  24. final Function? pageContentBuilder = _routerMap[name];
  25. if (pageContentBuilder != null) {
  26. if (settings.arguments != null) {
  27. final Route route = MaterialPageRoute(
  28. builder: (context) =>
  29. pageContentBuilder(context, arguments: settings.arguments));
  30. return route;
  31. } else {
  32. final Route route = MaterialPageRoute(
  33. builder: (context) => pageContentBuilder(context));
  34. return route;
  35. }
  36. }
  37. return null;
  38. },
  39. );
  40. }
  41. }
  42. //home.dart
  43. import 'package:flutter/material.dart';
  44. class HomeWidget extends StatefulWidget {
  45. const HomeWidget({super.key});
  46. @override
  47. State<HomeWidget> createState() => _HomeWidgetState();
  48. }
  49. class _HomeWidgetState extends State<HomeWidget> {
  50. @override
  51. Widget build(BuildContext context) {
  52. return Scaffold(
  53. appBar: AppBar(
  54. title: const Text("首页"),
  55. centerTitle: true,
  56. ),
  57. body: ElevatedButton(
  58. onPressed: () => Navigator.pushNamed(context, "/page",
  59. arguments: {"title": '我是命名路由传值', "id": 20}),
  60. child: const Text("我是命名路由传参"), //设置图标
  61. ),
  62. );
  63. }
  64. }
  65. //page.dart
  66. import 'package:flutter/material.dart';
  67. class PageWidget extends StatefulWidget {
  68. //接收参数
  69. final Map arguments;
  70. const PageWidget({super.key, required this.arguments });
  71. @override
  72. State<PageWidget> createState() => _PageWidgetState();
  73. }
  74. class _PageWidgetState extends State<PageWidget> {
  75. @override
  76. void initState() {
  77. super.initState();
  78. // str = "传递参数为${widget.id}";
  79. print(widget.arguments);
  80. }
  81. @override
  82. Widget build(BuildContext context) {
  83. return Scaffold(
  84. floatingActionButton: FloatingActionButton(
  85. onPressed: () => Navigator.pop(context),
  86. child: const Icon(Icons.arrow_left_outlined),
  87. ),
  88. appBar: AppBar(
  89. title: const Text("Page页面"),
  90. centerTitle: true,
  91. ),
  92. body: Text("${widget.arguments}"),
  93. );
  94. }
  95. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/995720
推荐阅读
相关标签
  

闽ICP备14008679号