命名路由是區別於基本路由的一種存在,方便於大型專案中路由的統一管理,現在,在前面基本路由的專案基礎上實現實現命名路由。
使用步驟
路由配置
命名路由在使用前,需要在根元件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的變數,這個是命名路由傳參的固定寫法。在命名路由中傳參的時候,除了需要新增前面說到的變數,還需要完成以下操作:
- 配置路由時,配置可選引數
- 路由跳轉前的頁面中,寫入需要傳遞的可選引數
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
),
],
);
}
}
複製程式碼
- 在路由跳轉後的頁面中,接收傳遞的引數
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'}"),
);
}
}
複製程式碼