flutter 命名路由跳转、传参

心已赠人 2021-07-24 19:08 668阅读 0赞
  1. 无参跳转:
  2. 1、引入要跳转的路由组件
  3. 2、在MaterialApphome同级
  4. routes:{ Map类型
  5. '/路由名':(context)=>组件路由名()
  6. },
  7. initialRoute:'/初始路由名'
  8. 3、在回调函数中设置
  9. 跳转:Navigator.pushNamed(context, '/命名路由')
  10. 替换当前页面: Navigator.of(context).pushReplacementNamed('/路由名');
  11. 回到根导航栏页面:
  12. (1)导入导航栏所在的文件
  13. (2)Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (context) =>
  14. new 导航栏所在类名()), (route) => route == null );
  15. 其中:
  16. 通过导航栏所在类设置构造函数来接收参数并在类中进行逻辑设置,可指定返回导航栏的哪个路由页面
  17. 有参跳转:
  18. 1、引入要跳转的路由组件
  19. 2、在该类中写如下形式的变量来配置路由信息
  20. var routes={ //Map类型
  21. "/命名路由":(context)=>组件名(),
  22. "/命名路由":(context,{arguments})=>组件名(arguments:arguments)
  23. };
  24. 3、在MaterialApphome同级
  25. onGenerateRoute: (RouteSettings settings) { // 统一处理
  26. //获取路由名称
  27. final String name = settings.name;
  28. //获取路由名后对应的值,即将方法赋值给方法
  29. final Function pageContentBuilder = this.routes[name];
  30. if (pageContentBuilder != null)
  31. { if (settings.arguments != null)
  32. {
  33. //跳转传参
  34. final Route route = MaterialPageRoute(
  35. //调用方法
  36. builder: (context) => pageContentBuilder(context, arguments: settings.arguments));
  37. return route;
  38. } else
  39. { final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context));
  40. return route;
  41. }
  42. }
  43. }
  44. 4、在回调函数中:
  45. Navigator.pushNamed(context, '/命名路由',arguments: {
  46. '键名':值
  47. });
  48. 5、命名路由的组件通过构造函数接收参数
  49. var arguments;
  50. 类名({this.arguments});
  51. this.arguments['键名'] 调用
  52. 将有参跳转配置信息封装进文件中,即123封装
  53. 1、引入要跳转的路由组件
  54. 2、引入
  55. import 'package:flutter/material.dart';
  56. 3、在该文件中写如下形式的变量来配置路由信息
  57. var routes={ //Map类型
  58. "/命名路由":(context)=>组件名(),
  59. "/命名路由":(context,{arguments})=>组件名(arguments:arguments)
  60. };
  61. var xx=(RouteSettings settings) { // 统一处理
  62. //获取路由名称
  63. final String name = settings.name;
  64. //获取路由名后对应的值,即将方法赋值给方法
  65. final Function pageContentBuilder = routes[name];
  66. if (pageContentBuilder != null)
  67. { if (settings.arguments != null)
  68. {
  69. //跳转传参
  70. final Route route = MaterialPageRoute(
  71. //调用方法
  72. builder: (context) => pageContentBuilder(context, arguments: settings.arguments));
  73. return route;
  74. } else
  75. { final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context));
  76. return route;
  77. }
  78. }
  79. };
  80. 4、在main.dart中,MaterialApp
  81. onGenerateRoute:xx
  82. 5、参数传递和获取步骤和上面相同

代码示例:
main.dart:

  1. import "package:flutter/material.dart";
  2. import 'page/1.dart';
  3. import 'page/2.dart';
  4. import 'page/3.dart';
  5. import 'page/routes.dart';
  6. void main()
  7. {
  8. runApp(App());
  9. }
  10. class App extends StatelessWidget{
  11. @override
  12. Widget build(BuildContext context) {
  13. // TODO: implement build
  14. return MaterialApp(
  15. home:Tabs(),
  16. //默认路由
  17. initialRoute:'/me' ,
  18. //路由跳转参数配置
  19. onGenerateRoute:routeInfo
  20. );
  21. }
  22. }
  23. //导航栏和主题都在Scaffold组件中设置
  24. class Tabs extends StatefulWidget {
  25. final index;
  26. //回到根导航栏时设置的构造函数
  27. Tabs({ Key key,this.index=0}) : super(key: key);
  28. @override
  29. _TabsState createState() => _TabsState(index:this.index);
  30. }
  31. class _TabsState extends State<Tabs> {
  32. int index=0;
  33. //将回到根导航栏的参数与页面关联
  34. _TabsState({ this.index=0});
  35. List _page=[Home3(),Home2(),Home4()];
  36. @override
  37. Widget build(BuildContext context) {
  38. return Scaffold(appBar: AppBar(title: Text("hh")),
  39. body:_page[this.index],
  40. bottomNavigationBar: BottomNavigationBar(
  41. items:[
  42. BottomNavigationBarItem(//单个bar内容
  43. icon:Icon(Icons.home),
  44. title:Text("首页"),
  45. ),
  46. BottomNavigationBarItem(
  47. icon:Icon(Icons.category),
  48. title:Text("第二页"),
  49. ),
  50. BottomNavigationBarItem(
  51. icon:Icon(Icons.category),
  52. title:Text("第三页"),
  53. )
  54. ],
  55. currentIndex: this.index, //选中的底部bar索引
  56. fixedColor: Colors.green, //选中的颜色
  57. onTap:(index){ setState(() {
  58. this.index=index;
  59. });}, //点击bar回调,必须传入index参数,bar的索引
  60. ),
  61. );
  62. }
  63. }
  64. class Home extends StatelessWidget {
  65. const Home({ Key key}) : super(key: key);
  66. @override
  67. Widget build(BuildContext context) {
  68. return Container(
  69. child: Column(
  70. children: <Widget>[
  71. ],
  72. ),
  73. );
  74. }
  75. }

封装的配置文件:

  1. import 'package:flutter/material.dart';
  2. import 'me.dart';
  3. import 'search.dart';
  4. var routes={ //Map类型
  5. "/me":(context)=>Me(),
  6. "/search":(context,{ arguments})=>Search(arguments:arguments)
  7. };
  8. var routeInfo=(RouteSettings settings) { // 统一处理
  9. //获取路由名称
  10. final String name = settings.name;
  11. //获取路由名后对应的值,即将方法赋值给方法
  12. final Function pageContentBuilder = routes[name];
  13. if (pageContentBuilder != null)
  14. { if (settings.arguments != null)
  15. {
  16. //跳转传参
  17. final Route route = MaterialPageRoute(
  18. //调用方法
  19. builder: (context) => pageContentBuilder(context, arguments: settings.arguments));
  20. return route;
  21. } else
  22. { final Route route = MaterialPageRoute( builder: (context) => pageContentBuilder(context));
  23. return route;
  24. }
  25. }
  26. };

跳转的回调函数所在文件:

  1. import 'package:flutter/material.dart';
  2. class Home3 extends StatefulWidget {
  3. Home3({ Key key}) : super(key: key);
  4. @override
  5. _Home3State createState() => _Home3State();
  6. }
  7. class _Home3State extends State<Home3> {
  8. @override
  9. Widget build(BuildContext context) {
  10. return Container(
  11. child:Column(
  12. crossAxisAlignment: CrossAxisAlignment.center,
  13. mainAxisAlignment: MainAxisAlignment.center,
  14. children: <Widget>[
  15. RaisedButton(child: Text("跳到search"),
  16. color:Theme.of(context).accentColor,
  17. onPressed:(){
  18. //跳转、跳转传参数
  19. // Navigator.pushNamed(context, '/search');
  20. Navigator.pushNamed(context, '/search',arguments: {
  21. 'id':"12344哈哈"
  22. });
  23. }
  24. ),
  25. SizedBox(height: 20,),
  26. ],
  27. ),
  28. );
  29. }
  30. }

接收路由参数组件:

  1. import 'package:flutter/material.dart';
  2. class Search extends StatelessWidget {
  3. var arguments;
  4. //接收参数
  5. Search({ this.arguments});
  6. @override
  7. Widget build(BuildContext context) {
  8. return Scaffold(
  9. floatingActionButton: FloatingActionButton(
  10. child: Text('返回'),
  11. onPressed: (){
  12. Navigator.of(context).pop();
  13. },
  14. ),
  15. appBar: AppBar(title:Text("search")),
  16. body:Home(arguments: this.arguments)
  17. );
  18. }
  19. }
  20. class Home extends StatelessWidget {
  21. var arguments;
  22. Home({ this.arguments});
  23. @override
  24. Widget build(BuildContext context) {
  25. return Container(
  26. child: Text("参数${this.arguments['id']}")
  27. );
  28. }
  29. }

回到导航栏组件:

  1. import 'package:flutter/material.dart';
  2. import '../main.dart';
  3. class Me2 extends StatefulWidget {
  4. String title='me';
  5. @override
  6. _Home2State createState() => _Home2State();
  7. }
  8. class _Home2State extends State<Me2> {
  9. @override
  10. Widget build(BuildContext context) {
  11. return Scaffold(appBar: AppBar(title: Text('me-son'),),
  12. body: Home(),
  13. );
  14. }
  15. }
  16. class Home extends StatelessWidget {
  17. @override
  18. Widget build(BuildContext context) {
  19. return Container(
  20. child: Column(
  21. children: <Widget>[
  22. Text('me-sonnnnn'),
  23. RaisedButton(
  24. color: Theme.of(context).accentColor,
  25. child: Text('回到根'),
  26. onPressed: (){
  27. //回到根导航栏,导航栏的类设置了构造函数接收参数,并将参数与页面关联
  28. Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (context) => new Tabs(index: 2)),
  29. (route) => route == null );
  30. },
  31. )
  32. ],
  33. )
  34. );
  35. }
  36. }

发表评论

表情:
评论列表 (有 0 条评论,668人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue+

    之前在原生JS的开发中,我们经常会用到根据某一状态进行页面的跳转。 比如:登录成功跳到首页,点击商品列表的某个商品跳转商品详情等。 而常见的写法就是: locat