命名路由是區別於基本路由的一種存在,方便於大型項目中路由的統一管理,現在,在前面基本路由的項目基礎上實現實現命名路由。
使用步驟
路由配置
命名路由在使用前,需要在根組件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)