路由導(dǎo)航用來管理所有頁面的跳轉(zhuǎn),需要在入口函數(shù)中定義跳轉(zhuǎn)名稱對應(yīng)的目標(biāo)頁面,方法如下:
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: _MyHomePage(), routes: { '/login': (BuildContext context) => LoginPage(), '/user': (BuildContext context) => UserPage(), }, ); } }
一、push打開新頁面
pushNamed
Navigator.of(context).pushNamed('/login');
- 說明:每次打開新的頁面都會(huì)在棧頂重新創(chuàng)建,并且舊頁面不會(huì)關(guān)閉
pushReplacementNamed
Navigator.of(context).pushReplacementNamed('/login');
- 說明:把當(dāng)前頁棧中的位置替換成目標(biāo)頁面
pushReplacement
Navigator.of(context).pushReplacement(context,new LoginPage());
- 說明:和pushReplacementNamed方法類似,不同點(diǎn)在于此方法可以直接new要跳轉(zhuǎn)的頁面,而pushReplacementNamed方法需要在routes中定義要跳轉(zhuǎn)的目標(biāo)頁面名稱
popAndPushNamed
Navigator.popAndPushNamed(context, '/login');
-說明:關(guān)閉當(dāng)前頁,打開目標(biāo)頁面
pushNamedAndRemoveUntil
1、Navigator.of(context).pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
2、Navigator.of(context).pushNamedAndRemoveUntil('/login', ModalRoute.withName('/'));
- 說明:
- 方法1:關(guān)閉所有頁面,打開新頁面。 (Route<dynamic> route) => false是否要關(guān)閉完所有頁面再打開目標(biāo)頁面
- 方法2:/默認(rèn)是主頁,關(guān)閉除主頁之外的其他頁面,再打開目標(biāo)頁面
pushAndRemoveUntil
Navigator.pushAndRemoveUntil(context,MaterialPageRoute(builder: (BuildContext context) => LoginPage()),(Route<dynamic> route) => false,);
- 說明:和pushNamedAndRemoveUntil方法類似,該方法不需要在入口routes中定義路由映射,直接通過new打開
popUntil
Navigator.popUntil(context, ModalRoute.withName('/login'));
- 說明:有些應(yīng)用場景下,用戶可能不得不填寫一個(gè)由三部分組成的長表單,該表單可能在移動(dòng)應(yīng)用程序的三個(gè)連續(xù)屏幕中顯示?,F(xiàn)在在表單的第三個(gè)頁面,用戶決定取消填寫表單。用戶單擊Cancel,就會(huì)彈出所有之前的與表單相關(guān)的屏幕,并將用戶帶回主屏幕,從而丟失所有與表單相關(guān)的數(shù)據(jù)(在這種情況下,這是我們想要的)。我們不會(huì)在這里推出任何新東西,只是回到以前的路線。。
二、pop
maybePop
Navigator.of(context).maybePop();
-說明:會(huì)自動(dòng)進(jìn)行判斷,如果當(dāng)前頁面pop后,會(huì)顯示其他頁面,不會(huì)出現(xiàn)問題,則將執(zhí)行當(dāng)前頁面的pop操作 否則將不執(zhí)行
canPop
bool canPop=Navigator.of(context).canPop();
-說明:判斷當(dāng)前頁面能否進(jìn)行pop操作,并返回bool值
pop
Navigator.of(context).pop();
-說明:直接pop當(dāng)前頁面
傳遞參數(shù)
MaterialPageRoute傳參
String params;
Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context) => new mainPage(params)));
//接收參數(shù)
class mainPage extends StatelessWidget {
final String userName;
mainPage(this.userName);
@override
Widget build(BuildContext context) {
print(userName);
}
帶返回值的頁面跳轉(zhuǎn)
String userName = "hhh";
Navigator.push(
context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new LoginPage(userName))).then((data){
result =data;
print(result);
});
//在LoginPage頁面使用 Navigator.of(context).pop('params');