Flutter筆記(八):route虹蒋、路由管理

什么是路由route

1、熟悉前端的朋友知道飒货,這跟web開(kāi)發(fā)中單頁(yè)應(yīng)用的Route概念意義是相同的魄衅;
2、Route在Android中通常指一個(gè)Activity膏斤,在iOS中指一個(gè)ViewController徐绑;
3、路由入棧(push)操作對(duì)應(yīng)打開(kāi)一個(gè)新頁(yè)面莫辨,路由出棧(pop)操作對(duì)應(yīng)頁(yè)面關(guān)閉操作;比如android中就是startActivity和finish毅访;
4沮榜、路由管理主要是指如何來(lái)管理路由棧。

Navigator

Navigator是一個(gè)路由管理的組件喻粹,它提供了打開(kāi)和退出路由頁(yè)方法蟆融。Navigator通過(guò)一個(gè)棧來(lái)管理活動(dòng)路由集合。
常用的兩個(gè)方法:
Future push(BuildContext context, Route route)
將給定的路由入棧(即打開(kāi)新的頁(yè)面)守呜,返回值是一個(gè)Future對(duì)象型酥,用以接收新路由出棧(即關(guān)閉)時(shí)的返回?cái)?shù)據(jù)。

  @optionalTypeArgs
  static Future<T> push<T extends Object>(BuildContext context, Route<T> route) {
    return Navigator.of(context).push(route);
  }

bool pop(BuildContext context, [ result ])
將棧頂路由出棧查乒,result為頁(yè)面關(guān)閉時(shí)返回給上一個(gè)頁(yè)面的數(shù)據(jù)弥喉。

  @optionalTypeArgs
  static bool pop<T extends Object>(BuildContext context, [ T result ]) {
    return Navigator.of(context).pop<T>(result);
  }

MaterialPageRoute

MaterialPageRoute 是Material組件庫(kù)提供的組件,它可以針對(duì)不同平臺(tái)玛迄,實(shí)現(xiàn)與平臺(tái)頁(yè)面切換動(dòng)畫(huà)風(fēng)格一致的路由切換動(dòng)畫(huà):

  MaterialPageRoute({
    @required this.builder,  //是一個(gè)WidgetBuilder類(lèi)型的回調(diào)函數(shù)由境,返回新路由的實(shí)例。
    RouteSettings settings,  //包含路由的配置信息,如路由名稱(chēng)虏杰、是否初始路由(首頁(yè))讥蟆。
    this.maintainState = true,  //是否釋放所占用的所有資源
    bool fullscreenDialog = false,  //新的路由頁(yè)面是否是一個(gè)全屏的模態(tài)對(duì)話框
  })

Navigator+MaterialPageRoute

點(diǎn)擊關(guān)于跳轉(zhuǎn)到About頁(yè)面

onTap: () {
    Navigator.push(context, MaterialPageRoute(builder: (context) => (About())));
}
3.jpg

命名路由

所謂“命名路由”(Named Route)即有名字的路由,我們可以先給路由起一個(gè)名字纺阔,然后就可以通過(guò)路由名字直接打開(kāi)新的路由了瘸彤,這為路由管理帶來(lái)了一種直觀、簡(jiǎn)單的方式笛钝。

注冊(cè)路由表

Map<String, WidgetBuilder> routes;

它是一個(gè)Map质况,key為路由的名字,是個(gè)字符串婆翔;value是個(gè)builder回調(diào)函數(shù)拯杠,用于生成相應(yīng)的路由widget。我們?cè)谕ㄟ^(guò)路由名字打開(kāi)新路由時(shí)啃奴,應(yīng)用會(huì)根據(jù)路由名字在路由表中查找到對(duì)應(yīng)的WidgetBuilder回調(diào)函數(shù)潭陪,然后調(diào)用該回調(diào)函數(shù)生成路由widget并返回。
可以理解成
www.xxx.com/ 進(jìn)入首頁(yè)
www.xxx.com/about 進(jìn)入關(guān)于我們頁(yè)面

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      initialRoute: "/",
      theme: ThemeData(primarySwatch: Colors.green, primaryColor: Colors.white),//設(shè)置App主題
      routes: {
        "/":(context)=>MyHomePage(),
        "/about":(context)=>About()
      },
    );
  }
}

通過(guò)路由名打開(kāi)新路由頁(yè)

  @optionalTypeArgs
  static Future<T> pushNamed<T extends Object>(
    BuildContext context,  //上下文
    String routeName, {    //路由名
    Object arguments,      //頁(yè)面?zhèn)鲄?   }) {
    return Navigator.of(context).pushNamed<T>(routeName, arguments: arguments);
  }

通過(guò)routeName跳轉(zhuǎn)

onTap: () {
  Navigator.pushNamed(context, "/about");
  //Navigator.push(context, MaterialPageRoute(builder: (context) => (About())));
},

路由參數(shù)傳遞

普通push傳遞參數(shù)

class OtherGank extends StatelessWidget {
  final String content;

  OtherGank({Key key, this.content}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var args=ModalRoute.of(context).settings.arguments;
    return Scaffold(
      appBar: AppBar(
        title: Text("其他Gank項(xiàng)目"),
      ),
      body: Center(child: Text(args==null?content:args)),
    );
  }
}
Navigator.push(context, MaterialPageRoute(builder: (context) => (OtherGank(content: "這是route傳遞的參數(shù)",))));

命名路由參數(shù)傳遞
傳遞

Navigator.pushNamed(context, "/other",arguments: "這是route傳遞的參數(shù)");

接收

var args=ModalRoute.of(context).settings.arguments;
4.jpg

路由返回值

接收返回參數(shù)

onTap: () async {
  var res = await Navigator.pushNamed(context, "/other",arguments: "這是route傳遞的參數(shù)");
  LogUtils.log(res);
},

傳遞返回參數(shù)

body: Center(child: RaisedButton(
  onPressed: (){
    Navigator.pop(context,"我要帶返回值回去~");
  },
  child: Text("帶參數(shù)回去"),
)),
5.jpg

點(diǎn)擊button返回的就是帶了參數(shù)的最蕾,點(diǎn)擊AppBar的返回按鈕則為null依溯。也就是說(shuō)點(diǎn)擊AppBar的返回按鈕執(zhí)行的是

Navigator.pop(context)

路由鉤子

當(dāng)使用命名路由跳轉(zhuǎn)時(shí)在跳轉(zhuǎn)之前可以做統(tǒng)一的登錄判斷權(quán)限判斷之類(lèi)的事情。

MaterialApp(
  ... //省略無(wú)關(guān)代碼
  onGenerateRoute:(RouteSettings settings){
      return MaterialPageRoute(builder: (context){
           String routeName = settings.name;
       // 如果訪問(wèn)的路由頁(yè)需要登錄瘟则,但當(dāng)前未登錄黎炉,則直接返回登錄頁(yè)路由,
       // 引導(dǎo)用戶(hù)登錄醋拧;其它情況則正常打開(kāi)路由慷嗜。
     }
   );
  }
);
  • 注意,onGenerateRoute只會(huì)對(duì)命名路由生效丹壕。

更詳細(xì)的資料

《Flutter實(shí)戰(zhàn)》路由管理

完整代碼

https://github.com/leiyun1993/FlutterDemo-GankIO
ps:以上完整代碼為Demo代碼庆械。本文中的代碼只為了測(cè)試路由功能,可能在項(xiàng)目中無(wú)法找到完全一樣的代碼菌赖!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缭乘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子琉用,更是在濱河造成了極大的恐慌堕绩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑时,死亡現(xiàn)場(chǎng)離奇詭異奴紧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)刁愿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)绰寞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事滤钱【鹾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵件缸,是天一觀的道長(zhǎng)铜靶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)他炊,這世上最難降的妖魔是什么争剿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮痊末,結(jié)果婚禮上蚕苇,老公的妹妹穿的比我還像新娘。我一直安慰自己凿叠,他們只是感情好涩笤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盒件,像睡著了一般蹬碧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炒刁,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天恩沽,我揣著相機(jī)與錄音,去河邊找鬼翔始。 笑死罗心,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的城瞎。 我是一名探鬼主播协屡,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼全谤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爷贫,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤认然,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后漫萄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卷员,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年腾务,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毕骡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖未巫,靈堂內(nèi)的尸體忽然破棺而出窿撬,到底是詐尸還是另有隱情,我是刑警寧澤叙凡,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布劈伴,位于F島的核電站,受9級(jí)特大地震影響握爷,放射性物質(zhì)發(fā)生泄漏跛璧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一新啼、第九天 我趴在偏房一處隱蔽的房頂上張望追城。 院中可真熱鬧,春花似錦燥撞、人聲如沸座柱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辆布。三九已至,卻和暖如春茶鉴,著一層夾襖步出監(jiān)牢的瞬間锋玲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工涵叮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭蹂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓割粮,卻偏偏與公主長(zhǎng)得像盾碗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舀瓢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容