Flutter代碼錦囊---集中管理路由與導(dǎo)航

當(dāng)一個(gè)Flutter項(xiàng)目的頁(yè)面多來(lái)以后,頁(yè)面跳來(lái)跳去的线梗,開(kāi)發(fā)者自己都會(huì)暈椰于,所以需要用一個(gè)集中、靈活的方式去管理項(xiàng)目中所有頁(yè)面的路由與導(dǎo)航仪搔。

通常我們是使用主頁(yè)(home)屬性設(shè)置應(yīng)用程序的默認(rèn)路由瘾婿,即Navigator.defaultRouteName/路由上的組件。除非指定了初始路由(initialRoute)屬性烤咧,否則這是在應(yīng)用程序正常啟動(dòng)時(shí)首先顯示的路由偏陪。如果無(wú)法顯示初始路由(initialRoute)屬性的路由,它也是顯示的路由煮嫌。

還有一個(gè)使用頻率較低的在生成路由上(onGenerateRoute)屬性笛谦,是應(yīng)用程序?qū)Ш降矫酚蓵r(shí)使用的路由生成器回調(diào)。通過(guò)自定義回調(diào)昌阿,可以靈活配置“什么路由名稱導(dǎo)航到什么頁(yè)面組件”饥脑。

下面我們就可以通過(guò)主頁(yè)(home)屬性、初始路由(initialRoute)屬性和在生成路由上(onGenerateRoute)屬性來(lái)集中管理項(xiàng)目中的所有頁(yè)面跳轉(zhuǎn)懦冰。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
      initialRoute: '/',
      onGenerateRoute: _getRoute,
    );
  }

  /// 路由(`Route`)是由導(dǎo)航器(`Navigator`)管理的條目的抽象類灶轰。
  /// 路由設(shè)置(`RouteSettings`)類是一些可能在構(gòu)建路由時(shí)有用的數(shù)據(jù)。
  Route<dynamic> _getRoute(RouteSettings settings) {
    // RouteSettings.name屬性刷钢,路由的名稱(例如`/settings`)笋颤。
    final String name = settings.name;
    // 根路徑路由。
    if (name == '/') {
      // Material頁(yè)面路由(`MaterialPageRoute`)類内地,通過(guò)平臺(tái)自適應(yīng)轉(zhuǎn)換替換整個(gè)屏幕的模態(tài)路由伴澄。
      // 對(duì)于Android赋除,頁(yè)面的入口轉(zhuǎn)換會(huì)向上滑動(dòng)頁(yè)面并淡入其中。退出轉(zhuǎn)換是相同的非凌,但方向相反举农。
      // 在iOS上,頁(yè)面從右側(cè)滑入敞嗡,然后反向退出并蝗。當(dāng)另一頁(yè)進(jìn)入以覆蓋它時(shí),頁(yè)面也會(huì)在視差中向左移動(dòng)秸妥。
      return MaterialPageRoute(
        // 設(shè)置屬性,此路由的設(shè)置沃粗。
        settings: settings,
        // 構(gòu)建者屬性粥惧,構(gòu)建路由的主要內(nèi)容。
        builder: (BuildContext context) => MyHomePage(),
      );
      // 主頁(yè)面路由最盅。
    } else if (name == '/home') {
      return MaterialPageRoute(
        settings: settings,
        builder: (BuildContext context) =>
            Scaffold(appBar: AppBar(title: Text('主頁(yè)面'))),
      );
      // 設(shè)置頁(yè)面路由突雪。
    } else if (name == '/setting') {
      return MaterialPageRoute(
        settings: settings,
        builder: (BuildContext context) =>
            Scaffold(appBar: AppBar(title: Text('設(shè)置頁(yè)面'))),
      );
    } else {
      return null;
    }
  }
}

然后附上上面代碼中的MyHomePage類代碼。

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo 主頁(yè)'),
      ),
      body: ListView(
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              // 使用命名路由導(dǎo)航到下一個(gè)屏幕涡贱。
              Navigator.pushNamed(context, '/home');
            },
            child: Text('主頁(yè)面'),
          ),
          RaisedButton(
            onPressed: () {
              // 使用命名路由導(dǎo)航到下一個(gè)屏幕咏删。
              Navigator.pushNamed(context, '/setting');
            },
            child: Text('設(shè)置頁(yè)面'),
          ),
        ],
      ),
    );
  }
}

最后運(yùn)行項(xiàng)目,效果就是下面動(dòng)圖顯示的樣子问词。

集中管理路由與導(dǎo)航
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末督函,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子激挪,更是在濱河造成了極大的恐慌辰狡,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垄分,死亡現(xiàn)場(chǎng)離奇詭異宛篇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)薄湿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門叫倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人豺瘤,你說(shuō)我怎么就攤上這事吆倦。” “怎么了炉奴?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵逼庞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞻赶,道長(zhǎng)赛糟,這世上最難降的妖魔是什么派任? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮璧南,結(jié)果婚禮上掌逛,老公的妹妹穿的比我還像新娘。我一直安慰自己司倚,他們只是感情好豆混,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著动知,像睡著了一般皿伺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盒粮,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天鸵鸥,我揣著相機(jī)與錄音,去河邊找鬼丹皱。 笑死妒穴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摊崭。 我是一名探鬼主播讼油,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呢簸!你這毒婦竟也來(lái)了矮台?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤根时,失蹤者是張志新(化名)和其女友劉穎嘿架,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啸箫,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耸彪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忘苛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝉娜。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扎唾,靈堂內(nèi)的尸體忽然破棺而出召川,到底是詐尸還是另有隱情,我是刑警寧澤胸遇,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布荧呐,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏倍阐。R本人自食惡果不足惜概疆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峰搪。 院中可真熱鬧岔冀,春花似錦、人聲如沸概耻。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鞠柄。三九已至侦高,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厌杜,已是汗流浹背矫膨。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留期奔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓危尿,卻偏偏與公主長(zhǎng)得像呐萌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谊娇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 一肺孤、SPA的概念 首先明確一個(gè)概念,SPA济欢,全稱為Single Page Application單頁(yè)應(yīng)用赠堵,一個(gè)單頁(yè)...
    耦耦閱讀 5,960評(píng)論 0 3
  • 本文是基于最新的react-navigation^2.9.1來(lái)書寫的。 要感謝掛著鈴鐺的兔看到一篇不錯(cuò)的介紹,這里...
    HT_Jonson閱讀 897評(píng)論 0 52
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評(píng)論 0 3
  • 【聲明:】本文是作者AWeiLoveAndroid原創(chuàng)法褥,版權(quán)歸作者 AWeiLoveAndroid 所有茫叭,侵權(quán)必究...
    AWeiLoveAndroid閱讀 15,315評(píng)論 2 23
  • 大部分應(yīng)用程序都包含多個(gè)頁(yè)面,并希望用戶能從當(dāng)前屏幕平滑過(guò)渡到另一個(gè)屏幕半等。移動(dòng)應(yīng)用程序通常通過(guò)被稱為“屏幕”或“頁(yè)...
    皺巴巴閱讀 41,265評(píng)論 10 69