命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,如今,在前面基本路由的项目基础上实现实现命名路由。vue
命名路由在使用前,须要在根组件main.dart中进行简单的配置(前面是页面路径,后面是页面中的组件名称): react
main.dart 主要代码:app
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
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中,也能够使用路由模块化来处理大量的命名路由。ide
为了如今路由模块化,首先须要在lib目录下,新建routes文件夹,在该文件夹下新建Routes.dart页面;而后将前面的路由配置移入到该文件中。模块化
Routes.dart 主要代码:ui
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中引入这个页面就能够了。this
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的变量,这个是命名路由传参的固定写法。在命名路由中传参的时候,除了须要添加前面说到的变量,还须要完成如下操做:spa
Home.dart 主要代码:3d
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
),
],
);
}
}
复制代码
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'}"),
);
}
}
复制代码