Flutter之路由管理(頁(yè)面跳轉(zhuǎn))

路由:核心是 路由映射表.
如:名字detail映射到 DetailPage頁(yè)面等

在Flutter中只估,路由管理主要有兩個(gè)類:Route和Navigator.

Route

一個(gè)頁(yè)面要想被路由統(tǒng)一管理,必須包裝為一個(gè)Route

Navigator

管理所有的Route的Widget蛛勉,通過一個(gè)Stack來(lái)進(jìn)行管理.

MaterialApp、CupertinoApp避除、WidgetsApp它們默認(rèn)是有插入Navigator的,在需要的時(shí)候顷霹,只需要直接使用即可.
Navigator.of(context)

Navigator常用方法:

// 路由跳轉(zhuǎn):傳入一個(gè)路由對(duì)象
Future<T> push<T extendsObject>(Route<T> route)

// 路由跳轉(zhuǎn):傳入一個(gè)名稱(命名路由)
Future<T> pushNamed<T extendsObject>(
  String routeName, {
    Object arguments,
  })

// 路由返回:可以傳入一個(gè)參數(shù)
bool pop<T extendsObject>([ T result ])

命名路由

  • 命名路由是將名字和路由的映射關(guān)系疲牵,在一個(gè)地方進(jìn)行統(tǒng)一的管理
  • 有了命名路由,就可以通過Navigator.pushNamed()方法來(lái)跳轉(zhuǎn)到新的頁(yè)面

命名路由的位置

放在MaterialApp的 initialRoute 和 routes 中

  • initialRoute:設(shè)置應(yīng)用程序從哪一個(gè)路由開始啟動(dòng)虑椎,設(shè)置了該屬性震鹉,就不需要再設(shè)置home屬性了

  • routes:定義名稱和路由之間的映射關(guān)系,類型為 Map<String, WidgetBuilder>

  • onGenerateRoute: 通過pushNamed進(jìn)行跳轉(zhuǎn)捆姜,但是對(duì)應(yīng)的name沒有在routes中有映射關(guān)系传趾,那么就會(huì)執(zhí)行onGenerateRoute 鉤子函數(shù) . 另外, onGenerateRoute也可以作為頁(yè)面跳轉(zhuǎn)的權(quán)限控制.;

  • onUnknownRoute: 如果打開的一個(gè)路由名稱是根本不存在的泥技,這個(gè)時(shí)候可以跳轉(zhuǎn)到一個(gè)統(tǒng)一的錯(cuò)誤頁(yè)面浆兰。

打開命名路由時(shí),如果指定的路由名在路由表中已注冊(cè)珊豹,則會(huì)調(diào)用路由表中的builder函數(shù)來(lái)生成路由組件簸呈;如果路由表中沒有注冊(cè),才會(huì)調(diào)用onGenerateRoute來(lái)生成路由店茶。

完整代碼

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
          primarySwatch: Colors.blue, splashColor: Colors.transparent),
      initialRoute: "/",
      routes: {
        "/": (context) => MyHomePage(title: 'Flutter Demo Home Page'), //注冊(cè)首頁(yè)路由
        // "/home": (ctx) => HomePage(),
        "/detail": (ctx) => DetailPage()
      },
      onGenerateRoute: (settings) {  //路由鉤子 .  手動(dòng)創(chuàng)建對(duì)應(yīng)的Route進(jìn)行返回蜕便;
        if (settings.name == "/about") {   //settings.name: 跳轉(zhuǎn)的路徑名稱
          return MaterialPageRoute(builder: (ctx) {
            return AboutPage(settings.arguments);  //settings.arguments:跳轉(zhuǎn)時(shí)攜帶的參數(shù)
          });
        }
        return null;
      },
      onUnknownRoute: (settings) {
        return MaterialPageRoute(builder: (ctx) {
          return UnknownPage();
        });
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // final message = ModalRoute.of(context).settings.arguments;

  var _message = '';

  _onPushTop(BuildContext context) {
    final future = Navigator.of(context)
        .pushNamed('/detail', arguments: "a home message of naned route"); //主動(dòng)跳轉(zhuǎn)時(shí)arguments傳遞參數(shù)

    // 2.獲取結(jié)果
    future.then((res) {
      setState(() {
        _message = res;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '顯示結(jié)果: ' + _message,
            ),
            FlatButton(
              child: Text("跳轉(zhuǎn)下一頁(yè)", style: TextStyle(color: Colors.black)),
              onPressed: () => _onPushTop(context),
            ),
            RaisedButton(
              child: Text("打開關(guān)于頁(yè)"),
              onPressed: () {
                Navigator.of(context).pushNamed(AboutPage.routeName,
                    arguments: "a home message");
              },
            ),
            RaisedButton(
              child: Text("打開未知頁(yè)面"),
              onPressed: () {
                Navigator.of(context).pushNamed("/abc");
              },
            ),
          ],
        ),
      ),
    );
  }
}

class DetailPage extends StatelessWidget {
  // 按鈕點(diǎn)擊執(zhí)行的代碼
  _onBackTap(BuildContext context) {
    Navigator.of(context).pop("a detail message");
  }

  @override
  Widget build(BuildContext context) {
    
    //接收上級(jí)頁(yè)面?zhèn)鬟^來(lái)的參數(shù)
    final message = ModalRoute.of(context).settings.arguments;

    return new Scaffold(
      appBar: new AppBar(
        title: Text('這是第二頁(yè)'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.of(context).pop("a back detail message"); //pop跳轉(zhuǎn)時(shí)直接放入?yún)?shù)
          },
        ),
      ),
      body: Center(
        child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                '首頁(yè)帶來(lái)的內(nèi)容: ' + message,
              ),

              // child:
              RaisedButton(
                child: Text("返回首頁(yè)"),
                onPressed: () => _onBackTap(context),
              ),
            ]),
      ),
    );
  }
}

class AboutPage extends StatelessWidget {
  static const String routeName = "/about";
  final String message;

  AboutPage(this.message);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("關(guān)于頁(yè)面"),
      ),
      body: Center(
        child: Text(
          message,
          style: TextStyle(fontSize: 30, color: Colors.red),
        ),
      ),
    );
  }
}

class UnknownPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("錯(cuò)誤頁(yè)面"),
      ),
      body: Container(
        child: Center(
          child: Text("頁(yè)面跳轉(zhuǎn)錯(cuò)誤"),
        ),
      ),
    );
  }
}

參考文章

Flutter 寫的app, 需要源碼可以私信~~


最好的筆記軟件

https://www.wolai.com/signup?invitation=6Z8Z3BP

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贩幻,隨后出現(xiàn)的幾起案子轿腺,更是在濱河造成了極大的恐慌两嘴,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件族壳,死亡現(xiàn)場(chǎng)離奇詭異溶诞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)决侈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門螺垢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人赖歌,你說我怎么就攤上這事枉圃。” “怎么了庐冯?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵孽亲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我展父,道長(zhǎng)返劲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任栖茉,我火速辦了婚禮篮绿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吕漂。我一直安慰自己亲配,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布惶凝。 她就那樣靜靜地躺著吼虎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苍鲜。 梳的紋絲不亂的頭發(fā)上思灰,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音混滔,去河邊找鬼洒疚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遍坟,可吹牛的內(nèi)容都是我干的拳亿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼愿伴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肺魁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起隔节,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹅经,失蹤者是張志新(化名)和其女友劉穎寂呛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘾晃,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贷痪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹦误。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劫拢。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖强胰,靈堂內(nèi)的尸體忽然破棺而出舱沧,到底是詐尸還是另有隱情,我是刑警寧澤偶洋,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布熟吏,位于F島的核電站,受9級(jí)特大地震影響玄窝,放射性物質(zhì)發(fā)生泄漏牵寺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一恩脂、第九天 我趴在偏房一處隱蔽的房頂上張望帽氓。 院中可真熱鬧,春花似錦东亦、人聲如沸杏节。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至镊逝,卻和暖如春壮啊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撑蒜。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工歹啼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人座菠。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓狸眼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親浴滴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拓萌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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