美文网首页
Flutter--Route和Navigator(一)

Flutter--Route和Navigator(一)

作者: 小迷糊_dcee | 来源:发表于2020-12-09 17:00 被阅读0次

    一、介绍

    Flutter中的路由(Route)通俗的桨就是页面跳转,类似android的activity跳转,在Flutter中通过导航器(Navigator)组件管理路由导航。并且提供了管理堆栈的方法。如:Navigator.push和Navigator.pop。

    Flutter提供了两种配置路由跳转的方式
    1、基本路由(静态路由)
    2、命名路由(动态路由)

    二、基本路由

    1、不传值跳转

    //固定写法(两种写法,任何一种都行),MyPageA为跳转的目标
    Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyPageA()));
    Navigator.push(context, MaterialPageRoute(builder: (context)=>MyPageA()));
    //销毁当前页面(两种写法,任何一种都行)
    Navigator.pop(context)
    Navigator.of(context).pop()
    

    2、传值跳转

    //跳转目标MyPageB并传值
    Navigator.push(context,MaterialPageRoute(builder: (context) => MyPageB(msg: "我是传递过来的值",)));
    
    //MyPageB定义参数,并重写构造方法
    String msg;
      MyPageB({this.msg="默认值"});
    

    三、基本路由的demo

    import 'package:flutter/material.dart';
    import 'MyPageA.dart';
    import 'MyPageB.dart';
    
    /**
     * 首页
     */
    void main() {
      runApp(MaterialApp(
        home: MyApp(),
      ));
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("页面跳转"),
          ),
          body: Container(
              alignment: Alignment.center,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  RaisedButton(
                    child: Text("静态跳转不传值"),
                    onPressed: () {
    //            Navigator.of(context).push(MaterialPageRoute(builder: (context)=>MyPageA()));
                      Navigator.push(context,
                          MaterialPageRoute(builder: (context) => MyPageA()));
                    },
                  ),
                  RaisedButton(
                    child: Text("静态跳转传值"),
                    onPressed: () {
                      Navigator.push(context,
                          MaterialPageRoute(builder: (context) => MyPageB(msg: "我是传递过来的值",)));
                    },
                  ),
                ],
              )
    //
              ),
        );
      }
    }
    

    MyPageA

    
    import 'package:flutter/material.dart';
    
    /**
     * 不传值的目标页面MyPageA
     */
    class MyPageA extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return
           Scaffold(
              appBar: AppBar(
                title: Text("我是页面A"),
              ),
              body: Container(
                alignment: Alignment.center,
                child: RaisedButton(
                  child: Text("返回上层"),
                  onPressed: (){
                    //销毁当天页面
                    Navigator.pop(context);
                  },
                ),
              ),
        );
      }
    }
    

    MyPageB

    
    import 'package:flutter/material.dart';
    
    /**
     * 传值的目标页面MyPageB
     */
    class MyPageB extends StatelessWidget {
      String msg;
      MyPageB({this.msg="默认值"});
      @override
      Widget build(BuildContext context) {
        return
           Scaffold(
              appBar: AppBar(
                title: Text("我是页面B"),
              ),
              body: Container(
                alignment: Alignment.center,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(msg),
                    RaisedButton(
                      child: Text("返回上层"),
                      onPressed: (){
                        //销毁当天页面
                        Navigator.pop(context);
                      },
                    ),
                  ],
                )
              ),
        );
      }
    }
    
    5dcd9aec0494449859cf11ae432a72d.png 264ea79e674f736d1a29da08f2d7be6.png
    eed07cb2457b7b85d9388fc6505eaa5.png

    四、命名路由

    1、不传值跳转

    //在MaterialApp根目录添加
    return MaterialApp(
          routes: {
            '/pageA': (content) => MyPageA(),
          },
          home: RouteStudy(),
    
        );
    
    //跳转的时候直接调用
    Navigator.pushNamed(context, '/pageA');
    

    2、传值跳转

    A、配置路由参数

    final routes = {
        '/pageA': (content) => MyPageA(),//不传值
        '/pageC': (content,{arguments}) => MyPageC(arguments:arguments)//传值
    
      };
    

    B、MaterialApp根目录配置路由监听

    onGenerateRoute: (RouteSettings settings) {
            //统一处理
            final String name = settings.name;
            final Function pageContentBuilder = this.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;
              }
            }
          },
    

    C、跳转的时候调用

    Navigator.pushNamed(context, "/pageC",arguments: {
                    "name":"随便写点",
                  });
    

    D、目标页面接收参数

    class MyPageC extends StatelessWidget {
      final arguments;
      MyPageC({this.arguments});
      @override
      Widget build(BuildContext context) {
        return null;
    
      }
    }
    

    五、命名路由的demo

    void main() {
      runApp(MyAPP());
    }
    
    class MyAPP extends StatelessWidget {
      final routes = {
        '/pageA': (content) => MyPageA(),
        '/pageC': (content,{arguments}) => MyPageC(arguments:arguments)
    
      };
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: RouteStudy(),
          // ignore: missing_return
          onGenerateRoute: (RouteSettings settings) {
            //统一处理
            final String name = settings.name;
            final Function pageContentBuilder = this.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;
              }
            }
          },
        );
      }
    }
    
    class RouteStudy extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("命名路由跳转"),
          ),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, '/pageA');
                },
                child: Text("命名路由不传值"),
              ),
              RaisedButton(
                onPressed: () {
                  Navigator.pushNamed(context, "/pageC",arguments: {
                    "name":"随便写点",
                  });
                },
                child: Text("命名路由传值"),
              )
            ],
          ),
        );
      }
    }
    

    MyPageA

    /**
     * 不传值的目标页面
     */
    class MyPageA extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return
           Scaffold(
              appBar: AppBar(
                title: Text("我是页面A"),
              ),
              body: Container(
                alignment: Alignment.center,
                child: RaisedButton(
                  child: Text("返回上层"),
                  onPressed: (){
                    //销毁当天页面
                    Navigator.pop(context);
                  },
                ),
              ),
        );
      }
    }
    

    MyPageC

    /**
     * 传值的目标页面MyPageC
     */
    class MyPageC extends StatelessWidget {
      final arguments;
      MyPageC({this.arguments});
      @override
      Widget build(BuildContext context) {
        return
           Scaffold(
              appBar: AppBar(
                title: Text("我是页面C"),
              ),
              body: Container(
                alignment: Alignment.center,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text(arguments["name"]),
                    RaisedButton(
                      child: Text("返回上层"),
                      onPressed: (){
                        //销毁当天页面
    //                    Navigator.pop(context);
                      Navigator.of(context).pop();
                      },
                    ),
                  ],
                )
              ),
        );
      }
    }
    
    da7c6558d1d06f6e337ca7164d98ac0.png c26b113e73dc480e4746a87755f1f92.png 4fb7d790fc46105b5e4fd3a2af00be4.png

    相关文章

      网友评论

          本文标题:Flutter--Route和Navigator(一)

          本文链接:https://www.haomeiwen.com/subject/crecgktx.html