回顧Flutter自研項(xiàng)目中的兩個(gè)知識(shí)點(diǎn):Navigator跟bottomNavigationBar挽荡。
首先,Navigator理解為頁(yè)面導(dǎo)航误续,主要運(yùn)用push跟pop兩個(gè)方法吨悍。push將元素添加到堆棧的頂部,pop從同一堆棧中刪除頂部元素蹋嵌。
push方法具體使用方式育瓜,(push就不介紹了)如下:
pushNamed:
這種路由需要一開(kāi)始現(xiàn)在創(chuàng)建App的時(shí)候定義
newMaterialApp(
....
routes: {
"nameRoute":(BuildContext context)=>newSecondPage(),
},
);
然后就可以在程序中使用Navigator.pushNamed來(lái)跳轉(zhuǎn)
Navigator.pushNamed(context, "nameRoute");
這種路由的缺點(diǎn)是不能傳遞參數(shù)。
pushReplacement 和 pushReplacementNamed:
二者都是用來(lái)替代當(dāng)前棧中棧頂元素. 只是接口的調(diào)用方式不同栽烂。
pushAndRemoveUntil 和 pushNamedAndRemoveUntil:
typedef RoutePredicate = bool Function(Route<dynamic> route);
//第一個(gè)參數(shù)context是上下文的context躏仇,
//第二個(gè)參數(shù)newRouteName是新的路由所命名的路徑
//第三個(gè)參數(shù)predicate,返回值是bool類型腺办,按照我的理解焰手,就是用來(lái)判斷Until所結(jié)
//束的時(shí)機(jī),如果為false的話怀喉,就會(huì)一直繼續(xù)執(zhí)行Remove的操作书妻,直到為true的時(shí)候,停止Remove操作躬拢,然后才執(zhí)行push操作躲履。
static Future<T> pushNamedAndRemoveUntil<T extends Object>(BuildContext context, String newRouteName, RoutePredicate predicate) {
return Navigator.of(context).pushNamedAndRemoveUntil<T>(newRouteName, predicate);
}
如果想在彈出新路由之前,刪除路由棧中的所有路由聊闯,那可以使用下面的這種寫法工猜,(Route route) => false,這樣能保證把之前所有的路由都進(jìn)行刪除菱蔬,然后才push新的路由域慷。
Navigator.of(context).pushNamedAndRemoveUntil('/LoginScreen', (Route<dynamic> route) => false);
如果想在彈出新路由之前,刪除路由棧中的部分路由。利用ModalRoute.withName(name)犹褒,來(lái)執(zhí)行判斷,可以看下面的源碼弛针,當(dāng)所傳的name跟堆棧中的路由所定義的時(shí)候叠骑,會(huì)返回true值,不匹配的話削茁,則返回false宙枷。
Navigator.of(context).pushNamedAndRemoveUntil('/screen4',ModalRoute.withName('/screen1'));
//ModalRoute.withName的源碼
static RoutePredicate withName(String name) {
return (Route<dynamic> route) {
return !route.willHandlePopInternally
&& route is ModalRoute
&& route.settings.name == name;
};
}
bool pop(BuildContext context, [ result ]):
將棧頂路由出棧,result為頁(yè)面關(guān)閉時(shí)返回給上一個(gè)頁(yè)面的數(shù)據(jù)茧跋。
popUntil()
popUntil()方法的過(guò)程其實(shí)跟上面差不多慰丛,就是是少了push一個(gè)新頁(yè)面的操作,只是單純的進(jìn)行移除路由操作瘾杭。
popUntil(RoutePredicate predicate);
Navigator.of(context).popUntil(ModalRoute.withName("/XXX"));
bottomNavigationBar(底部導(dǎo)航)
底部導(dǎo)航一般在首頁(yè)生命使用诅病,簡(jiǎn)要描述一下使用流程:
入口:狀態(tài)可變的組件:HomePage build方法中創(chuàng)建腳手架Scaffold,設(shè)置Scaffold的bottomNavigationBar粥烁。
bottomNavigationBar的組成:
@override
Widget build(BuildContext context) {
return Scaffold(
body: _bulidBody(),//底部tab按鍵對(duì)應(yīng)page
bottomNavigationBar: _buildButtomNavBar(),//創(chuàng)建底部導(dǎo)航
);
}
Widget _buildButtomNavBar(){
BottomNavigationBar(
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(...),
BottomNavigationBarItem(...),
BottomNavigationBarItem(...),
BottomNavigationBarItem(...),
],
onTap: _onSelectTab,
)
}
onTap按鍵切換時(shí)調(diào)用該方法贤笆,API使用方式(int index){......},_onSelectTab中調(diào)用setState方法來(lái)刷新當(dāng)前UI讨阻。