命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,如今,在前面基本路由的项目基础上实现实现命名路由。vue
命名路由在使用前,须要在根组件main.dart中进行简单的配置(前面是页面路径,后面是页面中的组件名称):react
main.dartapp
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)。less
Home.dartide
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页面;而后将前面的路由配置移入到该文件中。ui
Routes.dartthis
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中引入这个页面就能够了。spa
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 ); } }
在上面的Routes.dart页面中,多了一个onGenerateRoute的变量,这个是命名路由传参的固定写法。在命名路由中传参的时候,除了须要添加前面说到的变量,还须要完成如下操做:3d
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)