【Flutter 3-2】Flutter進階教程——路由Router和導航Navigator以及傳值

作者 | 弗拉德
來源 | 弗拉德(公眾號:fulade_me)

路由

在移動開發(fā)中,我們管頁面之間的跳轉叫做路由腰湾。在iOS中指的就是ViewController之間的跳轉,在Android中就是Activity之間的跳轉犁珠。路由是在移動端開發(fā)中非常重要的概念捧韵,它負責管理著各個頁面之間的跳轉還有傳值工作,是必不可缺少的控件秤掌。

路由Map

為了方便我們管理跳轉頁面愁铺,Flutter為我們 提供了路由Map。
路由Map由在main.dart文件里面MaterialApp的參數(shù)routes管理闻鉴,routes參數(shù)接收一個Map茵乱,Map里面就是我們項目的路由Map,你可以打開我的項目看到routes參數(shù)如下:

routes: {
  "/": (context) => MainPage(),
  "TextDemoPage": (context) => TextDemoPage(),
  "RaisedButtonDemoPage": (context) => RaisedButtonDemoPage(),
  "FlatButtonDemoPage": (context) => FlatButtonDemoPage(),
  "OutlineButtonDemoePage": (context) => OutlineButtonDemoePage(),
  "IconButtonDemoPage": (context) => IconButtonDemoPage(),
  "ContainerDemoPage": (context) => ContainerDemoPage(),
  "StatefulWidgetDemoPage": (context) => StatefulWidgetDemoPage(),
  "TextFieldDemoPage": (context) => TextFieldDemoPage(),
  "ImageDemoPage": (context) => ImageDemoPage(),
  "ColumnDemoPage": (context) => ColumnDemoPage(),
  "RowDemoPage": (context) => RowDemoPage(),
  "FlexibleDemoPage": (context) => FlexibleDemoPage(),
  "WrapDemoPage": (context) => WrapDemoPage(),
  "ListViewDemoPage": (context) => ListViewDemoPage(),
  "GridViewDemoPage": (context) => GridViewDemoPage(),
  "BottomNavigationBarDemoPage": (context) =>
      BottomNavigationBarDemoPage(),
  "RouterDemoPage": (context) => RouterDemoPage(),
  "RouterDemoPage2": (context) => RouterDemoPage2(),
},

其中key/對應的Value是整個Flutter項目的入口頁面孟岛,這里需要另外一個很重要的參數(shù)initialRoute來配合使用
我們給initialRoute參數(shù)傳值如下:

    initialRoute: "/",

這里表示的是Flutter項目的入口頁面對應的key/瓶竭,那么就會找到在routes/對應的頁面,也就是MainPage()

需要注意的是:
默認我們新創(chuàng)建的Flutter項目中MaterialApp是帶有home這個參數(shù)的渠羞,它也表示也是入口頁面斤贰。如果我們想要要使用路由Map的方式來管理路由,一定需要把home參數(shù)刪除掉堵未。

Navigator.pushNamed

在我們聲明好路由Map之后腋舌,我們就可以傳入前面的key的值來實現(xiàn)頁面的跳轉工作,這個時候我們需要借助的API是Navigator.pushNamed

 @optionalTypeArgs
  static Future<T> pushNamed<T extends Object>(
    BuildContext context,    /// context
    String routeName, {     /// 路由Map中 key 的值
    Object arguments,        /// 參數(shù)
   }) {
    return Navigator.of(context).pushNamed<T>(routeName, arguments: arguments);
  }

只需要傳入路由Map中key的值就可以實現(xiàn)跳轉渗蟹。
代碼如下:

Navigator.pushNamed(context, "RouterDemoPage2");

由于我們是跨平臺開發(fā)块饺,F(xiàn)lutter幫助我們實現(xiàn)了跳轉時候的轉場動畫,在iOS中動畫是從右側滑入到左側雌芽,返回的時候同樣是由左側滑出到右側授艰。在Android則是由下方彈出顯示到上方,返回的時候是由上方退出到下方彈出世落。

跳轉傳值

很多時候我們希望跳轉的時候可以傳值過去淮腾,這個時候我們可以通過自定義MaterialPageRoute來實現(xiàn)傳值。

MaterialPageRoute({
    /// builder 方法
    @required this.builder,
    /// 配置信息
    RouteSettings settings,
    ///  默認情況下,當入棧一個新路由時谷朝,原來的路由仍然會被保存在內存中洲押,如果想在路由沒用的時候釋放其所占用的所有資源,可以設置maintainState為false圆凰。
    this.maintainState = true,
    ///  表示新頁面是否是全屏展示杈帐,在iOS中,如果fullscreenDialog為true,新頁面將會從屏幕底部滑入
    bool fullscreenDialog = false,
})

我們只需要在構建新的頁面的時候傳入我們想要傳遞的參數(shù)即可

Navigator.of(context).push(MaterialPageRoute(builder: (context) {
  return RouterDemoPage3(passText: "Fulade");
}));

返回傳值

傳遞返回值我們使用Navigatorpop方法即可

Navigator.pop(context, "pop value");

pop方法接收一個參數(shù)為返回的攜帶的參數(shù),如果我們有多個參數(shù)报破,可以把它封裝為ListMap即可。

返回值我們需要在push方法后面使用then來接收

Navigator.of(context)
    .push(MaterialPageRoute(builder: (context) {
  return RouterDemoPage3(passText: "Fulade");
})).then((value) {
  setState(() {
    title = value;
  });
});

then函數(shù) 涉及到了Dart語音中很重要的概念 await 和future站叼,后面有機會我們再來詳細的說。

想體驗以上的示例的運行效果菇民,可以到我的Github倉庫項目flutter_app->lib->routes->router_page.dart查看尽楔,并且可以下載下來運行并體驗。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末第练,一起剝皮案震驚了整個濱河市翔试,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌复旬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冲泥,死亡現(xiàn)場離奇詭異驹碍,居然都是意外死亡,警方通過查閱死者的電腦和手機凡恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門志秃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚼酝,你說我怎么就攤上這事浮还。” “怎么了闽巩?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵钧舌,是天一觀的道長。 經(jīng)常有香客問我涎跨,道長洼冻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任隅很,我火速辦了婚禮撞牢,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己屋彪,他們只是感情好所宰,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畜挥,像睡著了一般仔粥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砰嘁,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天件炉,我揣著相機與錄音,去河邊找鬼矮湘。 笑死斟冕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缅阳。 我是一名探鬼主播磕蛇,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼十办!你這毒婦竟也來了秀撇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤向族,失蹤者是張志新(化名)和其女友劉穎呵燕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體件相,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡再扭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夜矗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泛范。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖紊撕,靈堂內的尸體忽然破棺而出罢荡,到底是詐尸還是另有隱情,我是刑警寧澤对扶,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布区赵,位于F島的核電站,受9級特大地震影響浪南,放射性物質發(fā)生泄漏惧笛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一逞泄、第九天 我趴在偏房一處隱蔽的房頂上張望患整。 院中可真熱鬧拜效,春花似錦、人聲如沸各谚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌渤。三九已至赴穗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膀息,已是汗流浹背般眉。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潜支,地道東北人甸赃。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像冗酿,于是被迫代替她去往敵國和親埠对。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容