Flutter 08: 圖解頁(yè)面小跳轉(zhuǎn) (一)

??????小菜最近在抽時(shí)間學(xué)習(xí) Flutter,從零開(kāi)始偏形,一步一步走的都很艱難,前幾天搭了一個(gè)基本的【登錄】頁(yè)面寡痰,現(xiàn)在學(xué)習(xí)下一步抗楔,頁(yè)面之間的跳轉(zhuǎn);今天小菜整理一下 Flutter 測(cè)試過(guò)程中常用的頁(yè)面跳轉(zhuǎn)方式拦坠。
??????最權(quán)威的資料永遠(yuǎn)是 Flutter 官網(wǎng)连躏,很精華,只可惜小菜英語(yǔ)水平太次贞滨,讀起來(lái)有點(diǎn)吃力入热。但小菜了解到,Flutter 中跳轉(zhuǎn)一定要用到 Navigator晓铆,就像是 Android 中的 Intent勺良;小菜理解為就是一個(gè)棧,進(jìn)進(jìn)出出跟 Android 是很類(lèi)似的骄噪,而 Flutter 也很直接尚困,關(guān)鍵詞就是 pushpop,小菜分別從這兩個(gè)關(guān)鍵詞來(lái)測(cè)試 Flutter 頁(yè)面間的跳轉(zhuǎn)链蕊。

push 入棧

1. 靜態(tài)注冊(cè)跳轉(zhuǎn) Using named navigator routes

??????使用靜態(tài)注冊(cè)方式時(shí)事甜,需要在主頁(yè)面的方法中添加 rount,小菜感覺(jué)有點(diǎn)像 AndroidManifest 中 intnt-filter 中靜態(tài)注冊(cè)滔韵;而 Flutter 中的 => 方法很像 Kotlin 中的 -> 減少代碼行逻谦。

routes: {
    'forgetPwdRoute': (BuildContext context) => new ForgetPwdPage(),
    'homeRoute': (BuildContext context) => new HomePage(),
},
1.1 pushNamed 方法單純跳轉(zhuǎn)頁(yè)面

??????Navigator.pushNamed 包含兩個(gè)參數(shù),第一個(gè)小菜理解為上下文環(huán)境陪蜻,第二個(gè)參數(shù)為靜態(tài)注冊(cè)的對(duì)應(yīng)的頁(yè)面名稱(chēng)邦马;如:

onTap: () {
    Navigator.pushNamed(context, "forgetPwdRoute");
},
1.2 pushNamedAndRemoveUntil 跳轉(zhuǎn)頁(yè)面并銷(xiāo)毀當(dāng)前頁(yè)面

??????Navigator.pushNamedAndRemoveUntil 包含三個(gè)參數(shù),第一個(gè)小菜理解為上下文環(huán)境囱皿,第二個(gè)參數(shù)為靜態(tài)注冊(cè)的對(duì)應(yīng)的頁(yè)面名稱(chēng)勇婴,第三個(gè)參數(shù)為跳轉(zhuǎn)后的操作,route == null 為銷(xiāo)毀當(dāng)前頁(yè)面嘱腥;如:

onPressed: () {
    Navigator.pushNamedAndRemoveUntil(context, "homeRoute", (route) => route == null);
}

??????Tips: 如果在 HomePage 頁(yè)面中調(diào)用 Navigator.pop(context); 會(huì)出現(xiàn)半個(gè)黑屏情況耕渴,所以小菜并不建議這種方式銷(xiāo)毀頁(yè)面,但是點(diǎn)擊返回按鈕是正常的齿兔。

2. 動(dòng)態(tài)注冊(cè)跳轉(zhuǎn)

2.1 push 方法單純跳轉(zhuǎn)頁(yè)面

??????Navigator.push 向下個(gè)頁(yè)面跳轉(zhuǎn)時(shí)橱脸,可以傳遞參數(shù)础米,自己生成頁(yè)面對(duì)象;如:

onPressed: () {
    Navigator.push<Object>(context,
        new MaterialPageRoute(
            builder: (BuildContext context) {
                return new HomePage();
             },
         ),
     );
}
2.2 push 方法單純跳轉(zhuǎn)頁(yè)面并傳遞參數(shù)
onPressed: () {
  Navigator.push<String>(
    context,
    new MaterialPageRoute(
      builder: (BuildContext context) {
        return new ForgetPwdPage(pwd: "123456");
      },
    ),
  );
}
2.3 pushAndRemoveUntil 跳轉(zhuǎn)頁(yè)面并銷(xiāo)毀當(dāng)前頁(yè)面

??????Navigator.pushAndRemoveUntil 向下個(gè)頁(yè)面跳轉(zhuǎn)時(shí)添诉,多傳一個(gè)參數(shù)即跳轉(zhuǎn)后的操作屁桑;如:

Navigator.pushAndRemoveUntil(context,
    new MaterialPageRoute(
  builder: (BuildContext context) {
    return new HomePage();
  },
), (route) => route == null);

pop 出棧

1. pop 銷(xiāo)毀當(dāng)前頁(yè)面

??????Navigator.pop 可以有一個(gè)參數(shù)或兩個(gè)參數(shù),如果只有一個(gè)參數(shù)栏赴,為上下文環(huán)境蘑斧;如果兩個(gè)參數(shù),第二個(gè)參數(shù)為返回值內(nèi)容须眷,可以為多種類(lèi)型竖瘾。

onPressed: () {
    Navigator.pop(context);
//    Navigator.pop(context, ['a,b,c']);
//    Navigator.pop(context, '這是 HomePage 頁(yè)');
},

2. popAndPushNamed 銷(xiāo)毀當(dāng)前頁(yè)面并跳轉(zhuǎn)指向新的頁(yè)面

??????Navigator.popAndPushNamed 第一個(gè)參數(shù)為上下文環(huán)境,第二個(gè)參數(shù)為靜態(tài)注冊(cè)的跳轉(zhuǎn)頁(yè)面名稱(chēng)花颗;如:

onPressed: () {
    Navigator.popAndPushNamed(context, 'forgetPwdRoute');
}

??????Tips: 小菜建議在使用返回值時(shí)捕传,注意上一個(gè)頁(yè)面是否已經(jīng)銷(xiāo)毀,否則會(huì)報(bào)異常扩劝。


then 返回值

??????有了頁(yè)面跳轉(zhuǎn)庸论,就需要傳遞參數(shù)和接收返回內(nèi)容,當(dāng)跳轉(zhuǎn)后的頁(yè)面設(shè)置 Navigator.pop 設(shè)置返回值時(shí)棒呛,用 then 關(guān)鍵詞可以接收聂示,測(cè)試如下:

// MyApp()
onPressed: () {
//  Navigator.pushNamed(context, 'homeRoute').then((Object result) {}
  Navigator.push<Object>(context, new MaterialPageRoute(
      builder: (BuildContext context) {
        return new HomePage();
      })).then((Object result) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        String str = result.toString();
        return new AlertDialog(
          content: new Text("您返回的內(nèi)容為:$str"),
        );
      },
    );
  });
}
// HomePage()
onPressed: () {
    Navigator.pop(context, ['a,b,c']);
}

主要源碼

跳轉(zhuǎn)頁(yè)面:
onPressed: () {
  // 按 name 方式跳轉(zhuǎn)頁(yè)面
//  Navigator.pushNamed(context, 'homeRoute');
  // 按 name 方式跳轉(zhuǎn)頁(yè)面,并接收返回值
//  Navigator.pushNamed(context, 'homeRoute').then((Object result) {
//    showDialog(
//      context: context,
//      builder: (BuildContext context) {
//        String str = result.toString();
//        return new AlertDialog(
//          content: new Text("您返回的內(nèi)容為:$str"),
//        );
//      },
//    );
//  });
  // 按 name 方式跳轉(zhuǎn)頁(yè)面簇秒,并銷(xiāo)毀當(dāng)前頁(yè)面
//  Navigator.pushNamedAndRemoveUntil(
//      context, "homeRoute", (route) => route == null);
  // 直接 push 方式跳轉(zhuǎn)頁(yè)面
//  Navigator.push<Object>(
//    context,
//    new MaterialPageRoute(
//      builder: (BuildContext context) {
//        return new HomePage();
//      },
//    ),
//  );
  // 直接 push 方式跳轉(zhuǎn)頁(yè)面,并接收返回內(nèi)容
  Navigator.push<Object>(context, new MaterialPageRoute(
      builder: (BuildContext context) {
    return new HomePage();
  })).then((Object result) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        String str = result.toString();
        return new AlertDialog(
          content: new Text("您返回的內(nèi)容為:$str"),
        );
      },
    );
  });
  // 直接 push 方式跳轉(zhuǎn)頁(yè)面宰睡,并銷(xiāo)毀當(dāng)前頁(yè)面
//  Navigator.pushAndRemoveUntil(context,
//      new MaterialPageRoute(
//    builder: (BuildContext context) {
//      return new HomePage();
//    },
//  ), (route) => route == null);
}
跳轉(zhuǎn)頁(yè)面并傳參
onTap: () {
  // 單純跳轉(zhuǎn)頁(yè)面
//  Navigator.pushNamed(context, "forgetPwdRoute");
  // 傳遞參數(shù)
  Navigator.push<String>(
    context,
    new MaterialPageRoute(
      builder: (BuildContext context) {
        return new ForgetPwdPage(pwd: "123456");
      },
    ),
  );
},
銷(xiāo)毀頁(yè)面
onPressed: () {
  // pop 一個(gè)參數(shù)蒲凶,銷(xiāo)毀當(dāng)前頁(yè)面
//  Navigator.pop(context);
  // pop 兩個(gè)參數(shù),返回一個(gè)數(shù)組
//  Navigator.pop(context, ['a,b,c']);
  // pop 兩個(gè)參數(shù)拆内,返回一個(gè)字符串
  Navigator.pop(context, 'HomePage');
  // popAndPushNamed 銷(xiāo)毀當(dāng)前頁(yè)面并跳轉(zhuǎn)新的頁(yè)面
//  Navigator.popAndPushNamed(context, 'forgetPwdRoute');
},

??????GitHub Demo


??????小菜剛接觸 Flutter 時(shí)間不長(zhǎng)旋圆,還有很多不清楚和不理解的地方,如果又不對(duì)的地方還希望多多指出麸恍。

來(lái)源:阿策小和尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灵巧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抹沪,更是在濱河造成了極大的恐慌刻肄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件融欧,死亡現(xiàn)場(chǎng)離奇詭異敏弃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)噪馏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)麦到,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绿饵,“玉大人,你說(shuō)我怎么就攤上這事瓶颠∧馍蓿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵粹淋,是天一觀的道長(zhǎng)吸祟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)桃移,這世上最難降的妖魔是什么欢搜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谴轮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吹埠。我一直安慰自己第步,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布缘琅。 她就那樣靜靜地躺著粘都,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刷袍。 梳的紋絲不亂的頭發(fā)上翩隧,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音呻纹,去河邊找鬼堆生。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雷酪,可吹牛的內(nèi)容都是我干的淑仆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哥力,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔗怠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吩跋,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寞射,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后锌钮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體桥温,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年梁丘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了策治。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脓魏。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖通惫,靈堂內(nèi)的尸體忽然破棺而出茂翔,到底是詐尸還是另有隱情,我是刑警寧澤履腋,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布珊燎,位于F島的核電站,受9級(jí)特大地震影響遵湖,放射性物質(zhì)發(fā)生泄漏悔政。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一延旧、第九天 我趴在偏房一處隱蔽的房頂上張望谋国。 院中可真熱鬧,春花似錦迁沫、人聲如沸芦瘾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)近弟。三九已至,卻和暖如春挺智,著一層夾襖步出監(jiān)牢的瞬間祷愉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赦颇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留二鳄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓媒怯,卻偏偏與公主長(zhǎng)得像泥从,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沪摄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 1躯嫉、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,980評(píng)論 3 119
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 6,409評(píng)論 0 17
  • 原文:ReactNative頁(yè)面跳轉(zhuǎn)Navigator ReactNative頁(yè)面跳轉(zhuǎn)Navigator Navi...
    難卻卻閱讀 2,825評(píng)論 0 1
  • “跳轉(zhuǎn)頁(yè)面”為啥加雙引號(hào)杨拐,其實(shí)所謂的跳轉(zhuǎn)頁(yè)面可能和以前認(rèn)識(shí)的不太一樣祈餐。因?yàn)樵贔lutter里,所有能看到的東西一般...
    坑吭吭閱讀 4,095評(píng)論 0 2
  • 青靈乃家中小妹哄陶,雖受爹娘帆阳、幾位兄長(zhǎng)的寵溺,但也家教甚嚴(yán)屋吨,只有在過(guò)年過(guò)節(jié)或特殊事由蜒谤,方可出門(mén)山宾。 平日只可與若梅書(shū)信交...
    李方知閱讀 329評(píng)論 0 3