Flutter 路由——頁面表及頁面參數(shù)綁定的自動生成

Flutter 自帶完善的路由框架,可以直接用Navigator.of(context).push(route)打開新頁面或者用命名的方式:Navigator.of(context).pushNamed($pageName);埋凯,然后在MaterialApp#onGenerateRoute中寫若干個switch-case根據(jù)頁面名稱進行分發(fā)。如此操作雖然可行糖儡,但是在頁面數(shù)量較多時,還是略微繁瑣怔匣。

有時候頁面需要外部傳參——依賴注入握联,常規(guī)的方法是:

  1. 在頁面Widget上添加變量
  2. 構造函數(shù)傳入
  3. 在State中widget.something引用
  4. 同時在onGenerateRoute中創(chuàng)建widget中調(diào)用對應的構造函數(shù)。

此方法稍顯繁瑣每瞒,并且在頁面依賴變化時金闽,又要重復這4個步驟。
如果能通過簡單的配置生成代碼剿骨,并且直接使用代芜,可以簡化源碼,節(jié)省時間并且避免出錯浓利。我先是在網(wǎng)上搜索相關的解決方案挤庇,但是沒找到钞速。因此自己動手造了這個輪子——router_generator
pub, github.

使用

安裝

dev_dependencies:
  router_generator: 0.1.1
  build_runner:

引用

import 'package:router_generator/router_generator.dart';

頁面標記

@Router('third')
class ThirdPage extends StatefulWidget {

在頁面Widget上使用Router注解,頁面名作為參數(shù)

參數(shù)標記

@inject
class ThirdPageState extends State<ThirdPage> {
  @RouterParam(required: true)
  Person person;
  @RouterParam(key: 'set_key')
  bool setKey = false;
  @routerParam
  Map<String, int> map;

給需要注入依賴的State添加inject注解嫡秕,并且在變量上添加RouterParam 注解渴语。
RouterParam有兩個可選的參數(shù):

  • key: 此參數(shù)在參數(shù)表中的鍵,默認用變量名
  • required:是否必須昆咽,如果是的話驾凶,在依賴注入時,如果參數(shù)表中沒有此參數(shù)掷酗,debug模式下會報錯调违,并且在生成的createRouteArgs方法中此參數(shù)為必須。

如果兩個參數(shù)都不需要汇在,建議用routerParam注解翰萨。
從例子中可以看到,dart的各種類型包括自定義的model都是支持的糕殉。

代碼生成

執(zhí)行命令:flutter packages pub run build_runner build, 更多使用方法可參考 build_runner

生成的若干dart文件中包含:

  • 頁面路由表 main.router_table.dart
  • 頁面依賴注入 $page.inject.dart 若干個,其中 page 是你 state所在 文件的名稱殖告,例如 foo.dart對應foo.inject.dart

引用

路由生成

MaterialApp(
  ...
  onGenerateRoute: (RouteSettings settings) {
    String pageName = settings.name;
    var arguments = settings.arguments;
    if (arguments is Map<String, dynamic>) {
      deliverParams(pageName, arguments);
    }
    return MaterialPageRoute(builder: (_) {
      return getWidgetByPageName(pageName);
    });
  },
);

修改onGenerateRoute方法阿蝶,調(diào)用main.router_table.dart中的getWidgetByPageName,獲取對應的頁面Widget黄绩,并且deliverParams()傳遞參數(shù)羡洁。

對于嵌入原有原生的App,可參考:

onGenerateRoute: (RouteSettings settings) {
    String route = settings.name;
    Uri uri = Uri.parse(route);
    var pageName = uri.path.replaceFirst(RegExp('/'), '');
    lastRouteParams = uri.queryParameters;
    return PageRouteBuilder(pageBuilder: (BuildContext context,
        Animation<double> animation, Animation<double> secondaryAnimation) {
      return getWidgetByPageName(pageName);
    });
  },

Map<String, String>類型的參數(shù)表(即uri中值為字符串的參數(shù)表)也是支持的爽丹,不需要額外轉換筑煮。

依賴注入

在已注入依賴的state中import 對應的inject文件,在使用變量前注入依賴粤蝎,如:

@override
void initState() {
    super.initState();
    injectDependencies(this);
    doSometing();
}

傳遞依賴


Navigator.of(context).pushNamed('second',
                    arguments: {'name': 'bar', 'count': 666});
                    

可以手動創(chuàng)建依賴的參數(shù)表真仲,但建議使用 inject 文件中的 createRouteArgs方法。

Navigator.of(context).pushNamed('second',
                    arguments: createRouteArgs(name: 'bar', count: 666));

總結

如此初澎,就完成了頁面表及頁面參數(shù)綁定的自動生成秸应,增減頁面和注入?yún)?shù)變得如此簡單。有問題的同學歡迎留言或者提issue碑宴,github點個贊??

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末软啼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子延柠,更是在濱河造成了極大的恐慌祸挪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞间,死亡現(xiàn)場離奇詭異贿条,居然都是意外死亡雹仿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門闪唆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盅粪,“玉大人,你說我怎么就攤上這事悄蕾∑惫耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵帆调,是天一觀的道長奠骄。 經(jīng)常有香客問我,道長番刊,這世上最難降的妖魔是什么含鳞? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮芹务,結果婚禮上蝉绷,老公的妹妹穿的比我還像新娘。我一直安慰自己枣抱,他們只是感情好熔吗,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佳晶,像睡著了一般桅狠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轿秧,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天中跌,我揣著相機與錄音,去河邊找鬼菇篡。 笑死漩符,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逸贾。 我是一名探鬼主播陨仅,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铝侵!你這毒婦竟也來了灼伤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤咪鲜,失蹤者是張志新(化名)和其女友劉穎狐赡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟丙,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡颖侄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年鸟雏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片览祖。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡孝鹊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出展蒂,到底是詐尸還是另有隱情又活,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布锰悼,位于F島的核電站柳骄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箕般。R本人自食惡果不足惜耐薯,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丝里。 院中可真熱鬧曲初,春花似錦、人聲如沸杯聚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽械媒。三九已至,卻和暖如春评汰,著一層夾襖步出監(jiān)牢的瞬間纷捞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工被去, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留主儡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓惨缆,卻偏偏與公主長得像糜值,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坯墨,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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