zoukankan      html  css  js  c++  java
  • flutter中的命名路由

    命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,现在,在前面基本路由的项目基础上实现实现命名路由。

    使用步骤

    路由配置

    命名路由在使用前,需要在根组件main.dart中进行简单的配置(前面是页面路径,后面是页面中的组件名称):

      

    main.dart

    import 'package:flutter/material.dart';
    
    import 'pages/Tabs.dart';
    import 'pages/Form.dart';
    import 'pages/Search.dart';
    
    void main() => runApp(MyApp());
    class MyApp extends StatelessWidget {  
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home:Tabs(),
          routes: {
            '/form':(context)=>FormPage(),
            '/search':(context)=>SearchPage(),
          }
        );
      }
    }

    路由跳转

    路由配置完成以后,在需要进行路由跳转的地方直接输入上面配置的名称使用就可以了(从Home.dart中跳转到Search.dart)。

    Home.dart

    import 'package:flutter/material.dart';
    
    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      @override
      Widget build(BuildContext context) {
        return Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
                child: Text("跳转到搜索页面"),
                onPressed: () {
                  //路由跳转
                  Navigator.pushNamed(context, '/search');
                },
                color: Theme.of(context).accentColor,
                textTheme: ButtonTextTheme.primary
            ),
            SizedBox(height: 20),        
    
          ],
        );
      }
    }

     路由模块化

     在vue和react中,为了方便管理大量的路由,通常是采用路由模块化来处理,在flutter中,也可以使用路由模块化来处理大量的命名路由。

    为了现在路由模块化,首先需要在lib目录下,新建routes文件夹,在该文件夹下新建Routes.dart页面;然后将前面的路由配置移入到该文件中。

     Routes.dart

    import 'package:flutter/material.dart';
    
    import '../pages/Tabs.dart';
    import '../pages/Form.dart';
    import '../pages/Search.dart';//配置路由
    final routes={
          '/':(context)=>Tabs(),
          '/form':(context)=>FormPage(),'/search':(context,{arguments})=>SearchPage(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;
            }
          }
    };

    然后在main.dart中引入这个页面就可以了。

    import 'package:flutter/material.dart';
    import 'routes/Routes.dart';
    
    void main() => runApp(MyApp());
    class MyApp extends StatelessWidget {  
      
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          // home:Tabs(),   
          initialRoute: '/',     //初始化的时候加载的路由
          onGenerateRoute: onGenerateRoute
         
        );
      }
    }

    命名路由传参(从Home.dart页面跳转到Search.dart页面)

    在上面的Routes.dart页面中,多了一个onGenerateRoute的变量,这个是命名路由传参的固定写法。在命名路由中传参的时候,除了需要添加前面说到的变量,还需要完成以下操作:

    1,配置路由时,配置可选参数

    2,路由跳转前的页面中,写入需要传递的可选参数

    Home.dart

    import 'package:flutter/material.dart';
    
    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      @override
      Widget build(BuildContext context) {
        return Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
                child: Text("跳转到搜索页面"),
                onPressed: () {
                  //路由跳转
                  Navigator.pushNamed(context, '/search',arguments: {
                    "id":123
                  });
                },
                color: Theme.of(context).accentColor,
                textTheme: ButtonTextTheme.primary
            ),
          ],
        );
      }
    }

    3,在路由跳转后的页面中,接收传递的参数

    Search.dart

    import 'package:flutter/material.dart';
    
    class SearchPage extends StatelessWidget {
      
      final arguments;
      SearchPage({this.arguments});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar:AppBar(
            title: Text("搜索页面"),
          ) ,
          body: Text("搜索页面内容区域${arguments != null ? arguments['id'] : '0'}"),
        );
      }
    }

     代码下载:点这里(k9bg)

  • 相关阅读:
    098实战 Job的调度
    maven在windows下的安装
    Map的知识点梳理(不包含collections工具类)
    001 LRU-缓存淘汰算法
    Android渲染机制和丢帧分析
    Android性能优化典范
    正确使用Android性能分析工具——TraceView
    android View 绘制完成监听
    那些年我们用过的显示性能指标
    view, surfaceView, invalidate, postInvalidate, 刷新屏幕
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/11006780.html
Copyright © 2011-2022 走看看