Flutter中,路由管理主要有兩個類:Route和Navigator
-
Route是一個抽象類,可以使用MaterialPageRoute,或者iOS的CupertinoPageRoute -
Navigator是管理所有的Route的Widget,通過一個Stack來進行管理的,不需要我們手動創(chuàng)建,直接使用就行。
基本push&pop
CupertinoButton(
child: Text('push'),
onPressed: (){
Navigator.of(ctx).push(MaterialPageRoute(builder: (ctx){
return HJEventResponsePage();
}));
},
),
返回pop
CupertinoButton(
child: Text('pop'),
onPressed: (){
/// 帶參數(shù)
Navigator.of(context).pop('from detail');
},
),
獲取pop回來的參數(shù)
Future result = Navigator.push(ctx, MaterialPageRoute(builder: (ctx){
return HJEventResponsePage();
}));
result.then((value) {
//print(value);
setState(() {
///獲取pop回的參數(shù)顯示
_message = value;
});
});
命名路由
命名路由是將名字和路由的映射關系,在一個地方進行統(tǒng)一的管理,這樣我們可以通過Navigator.pushNamed() 方法來跳轉到新的頁面
MaterialApp(
// home: HJRouteTestPage(),
///設置應用程序從哪一個路由開始啟動,設置了該屬性,就不需要再設置home屬性了
initialRoute: '/',
routes: {
HJRouteAboutPage.routeName: (ctx) => HJRouteAboutPage(),
HJRouteTestPage.routeName:(ctx) => HJRouteTestPage()
},
);
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class HJRouteAboutPage extends StatelessWidget {
static const String routeName = '/hjabout';
@override
Widget build(BuildContext context) {
/// 拿到命名路由傳遞的參數(shù)
final _msg = ModalRoute.of(context).settings.arguments;
return Scaffold(
appBar: AppBar(
title: Text('關于頁'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(_msg),
CupertinoButton(child: Text('返回'), onPressed: (){
Navigator.pop(context);
})
],
),
),
);
}
}
跳轉
Navigator.pushNamed(ctx, HJRouteAboutPage.routeName,arguments: 'from route test');
/// 拿到命名路由傳遞的參數(shù)
final _msg = ModalRoute.of(context).settings.arguments;
路由鉤子
///找不到路由時調用, 跳轉的界面需要參數(shù),命名路由不太方便
onGenerateRoute: (settings){
if (settings.name == HJRouteDetailPage.routeName){
return MaterialPageRoute(builder: (ctx){
return HJRouteDetailPage(settings.arguments);
});
}
return null;
},
/// 未找到路由,跳轉統(tǒng)一界面
onUnknownRoute: (settings){
return MaterialPageRoute(builder: (ctx){
return HJRouteUnknownPage();
});
},
實際項目里大部分可能使用get庫一套的狀態(tài)管理,路由等,用起來也方便,可以了解了解,以及getx插件的使用。