以前的文章介紹過基本路由,使用基本路由相對簡單靈活,適用於應用中頁面很少的場景。而在應用中頁面比較多的狀況下,再使用基本路由,會致使大量的重複代碼,此時使用命名路由會很是方便bash
路由命名即給頁面起個名字,而後直接經過頁面名字便可打開該頁面app
要經過名字來指定打開的頁面,必須先給應用程序 MaterialApp 提供一個頁面名稱映射規則,即路由表 routesless
路由表其實是一個 Map<String,WidgetBuilder>,其中 key 對應頁面名字,value 則是一個 WidgetBuilder 回調方法,咱們須要在 WidgetBuilder 回調方法中建立對應的頁面。在路由表中定義好頁面名字後,就能夠經過 Navigator.pushNamed 來打開頁面ide
以下代碼演示了命名路由的使用方法ui
首先定義一個路由集 Routes.dartspa
import 'package:flutter/material.dart';
import 'package:flutter_app_route/main.dart';
final String home = '/';
final String secondPage = '/SecondPage';
final String threePage = '/ThreePage';
final String fourPage = '/FourPage';
// 配置路由命名信息
final routes = {
home: (context) => Home(),
secondPage: (context) => Second(),
threePage: (context) => Three(),
fourPage: (context) => Four(),
};
class UnknownPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('跳轉錯誤'),
centerTitle: true,
),
);
}
}
複製代碼
接着在 MyNameRouteApp 中註冊路由及錯誤頁面路由code
class MyNameRouteApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter',
// 註冊路由
routes: mRoutes.routes,
onUnknownRoute: (RouteSettings setting) =>
MaterialPageRoute(builder: (context) => mRoutes.UnknownPage()),
);
}
}
複製代碼
接下來,在第一頁中有個按鈕,點擊按鈕跳轉至第二頁cdn
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.pushNamed(context, mRoutes.secondPage);
},
child: Text('下一頁'),
),
);
}
}
複製代碼
第二頁中也是按鈕,點擊後銷燬當前頁並跳轉至第三頁,並給第三頁傳值three
class Second extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('第二頁'),
centerTitle: true,
),
body: Center(
child: RaisedButton(
onPressed: () {
// 將當前頁面替換爲新頁面,即跳轉到新頁面後將當前頁面從堆棧中移除
Navigator.pushReplacementNamed(context, mRoutes.threePage,
arguments: 'Android小白營');
},
child: Text('跳轉至下一頁,並移除當前頁')),
),
);
}
}
複製代碼
第三頁中有一個按鈕和兩個 Text,一個 Text 用於顯示第二頁傳過來的信息,一個 Text 用於顯示第四頁關閉時回傳過來的信息路由
class Three extends StatefulWidget {
@override
_ThreeState createState() => _ThreeState();
}
class _ThreeState extends State<Three> {
String _msg = '';
@override
Widget build(BuildContext context) {
String name = ModalRoute.of(context).settings.arguments as String;
return Scaffold(
appBar: AppBar(
title: Text('第三頁'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
onPressed: () {
// 打開Four頁面,並監聽Four頁面關閉時傳遞的參數
Navigator.pushNamed(context, mRoutes.fourPage)
.then((msg) => setState(() => _msg = msg));
},
child: Text('打開頁面,並在頁面關閉時傳遞參數'),
),
Text(name),
Text(_msg)
],
),
// child: Text(name),
));
}
}
複製代碼
第四頁中有一個按鈕,用於關閉當前頁並向上一頁傳值
class Four extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
onPressed: () {
// 關閉頁面並傳遞參數
Navigator.pop(context, '歡迎關注\"Android小白營\"');
},
child: Text('退出'),
)),
);
}
}
複製代碼
其中 mRoutes 爲路由集 Routes.dart 的引用
import 'package:flutter_app_route/routes/Routes.dart' as mRoutes;
複製代碼
運行下代碼,效果以下