美文网首页
Flutter 路由

Flutter 路由

作者: 付小影子 | 来源:发表于2019-11-24 16:49 被阅读0次

    flutter 路由 页面跳转

    在flutter中界面就是组件
    Flutter 中的路由通俗的讲就是页面跳转。在 Flutter 中通过 Navigator 组件管理路由导航。 并提供了管理堆栈的方法。如:Navigator.push 和 Navigator.pop
    Flutter 中给我们提供了两种配置路由跳转的方式:1、基本路由 2、命名路由

    基本路由

    //基本路由跳转页面,带参数的跳转跟调用普通组件的方式一样的
      return Column(
          children: <Widget>[
            RaisedButton(
              child: Text("跳转搜索界面"),
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (BuildContext context) {
                  return SearchPage(
                    title: "首页传递的数据",
                  );
                }));
              },
            )
          ],
        );
    
    //跳转界面 接收数据,自定义返回
    class SearchPage extends StatelessWidget {
      String title;
    
      SearchPage({this.title = "搜索页面"});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(this.title),
          ),
          body: Text("我是搜索页面"),
          floatingActionButton: FloatingActionButton(
            child: Text("返回"),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        );
      }
    }
    

    命名路由的系列用法 模板使用

    抽离出来的route文件

    import 'package:flutter/material.dart';
    import 'package:flutter_demp/pages/ProductInfoPage.dart';
    import 'package:flutter_demp/pages/ProductPage.dart';
    import '../pages/Tabs.dart';
    
    class RoutePage{
      static final String PRODUCT_PAGE = "/product";
      static final String MAIN_PAGE = "/";
      static final String PRODUCTINFO_PAGE = "/productinfo";
    }
    
    class RouteKey{
      static final String KEY_PID = "key_pid";
    }
    
    //配置路由
    final routes={
      RoutePage.MAIN_PAGE:(context)=>Tabs(),
      RoutePage.PRODUCT_PAGE:(context)=>ProductPage(),
      RoutePage.PRODUCTINFO_PAGE:(context,{arguments})=>ProductInfoPage(arguments:arguments),
    
    };
    
    
    //固定写法
    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;
            }
          }
    };
    

    根节点 主入口

    import 'package:flutter/material.dart';
    import 'package:flutter_demp/routes/Routes.dart';
    
    main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData.light(),
          title: "MaterialApp title",
          //home: Tabs(),
          initialRoute: RoutePage.MAIN_PAGE,
          onGenerateRoute: onGenerateRoute,
        );
      }
    }
    

    不带传值的跳转

      RaisedButton(
              child: Text("跳转商品界面"),
              onPressed: () {
                Navigator.pushNamed(context, RoutePage.PRODUCT_PAGE);
              },
            ),
    

    带参数的跳转

    RaisedButton(
              onPressed: () {
                Navigator.pushNamed(context, RoutePage.PRODUCTINFO_PAGE,
                    arguments: {
                      RouteKey.KEY_PID: "20111515",
                    });
              },
              child: Text("跳转商品详情"),
            )
    

    接收命名路由的参数传值

    import 'package:flutter/material.dart';
    import 'package:flutter_demp/routes/Routes.dart';
    
    class ProductInfoPage extends StatefulWidget {
      Map arguments;
    
      ProductInfoPage({this.arguments});
    
      @override
      ProductState createState() => ProductState(arguments: arguments);
    }
    
    class ProductState extends State<ProductInfoPage> {
      Map arguments;
    
      ProductState({this.arguments});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("商品详情页面"),
          ),
          body: Text(
              "商品pid = ${arguments != null ? arguments[RouteKey.KEY_PID] : 000}"),
        );
      }
    }
    

    路由返回

    返回到上一级页面 pop

    Navigator.of(context).pop();

    替换路由 pushReplacementNamed

    比如我们从用户中心页面跳转到了 registerFirst 页面,然后从 registerFirst 页面通过 pushReplacementNamed 跳转到了 registerSecond 页面。这个时候当我们点击 registerSecond 的返回按钮的时候它会直接返回到用户中心。
    Navigator.of(context).pushReplacementNamed('/registerSecond');

    返回到根路由 即清空所有上层路由,回到要跳转的路由

    比如我们从用户中心跳转到 registerFirst 页面,然后从 registerFirst 页面跳转到 registerSecond 页面,然后从 registerSecond 跳转到了 registerThird 页面。这个时候我们想的是 registerThird 注册成功后返回到用户中心。 这个时候就用到了返回到根路由的方法。

       //返回根
                    Navigator.of(context).pushAndRemoveUntil(
                        new MaterialPageRoute(
                            builder: (context) => new Tabs(index: 2)),
                        (route) => route == null);
                  },
    

    相关文章

      网友评论

          本文标题:Flutter 路由

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