Flutter 法法路由注解

最近改造項目,感覺Flutter路由這塊需要打磨打磨,想起來之前好像聽說過通過注解來生成路由映射的工具褲,嗯,很快就搜索到阿里寫的annotation_route,先start一下,看了下issue,沒有對頁面分散到各個模塊的情況進行處理,看了下issue時間,貌似沒有改進的計劃,放棄。

只能自己挖井(挖坑)了,不久之前剛學會用Dart Pub Global 創建命令行應用程序
感覺這個注解應該跟官方的json_annotation很相似,于是立刻下載下來,看源碼。

在看源碼的過程中,低調大佬做了個ok_route,以及掘金一個小伙伴做了route_generator_repo,都是通過注釋,來生成路由映射的解決方案,因為最后呈現方式跟自己構思的有所不同,所以還是決定繼續看源碼,哈哈哈,感興趣的同學可以去看看,找到合適自己的路由注解。

看到源碼,首先映入眼簾的是

dependencies:
  analyzer: any

analyzer主要負責將dart代碼轉換成為ast(abstract syntax tree),具體是什么意思,我隨便一搜索,又是大廠的文章
Flutter動態化,看完感覺如果官方能支持dart代碼=》AST=》dart代碼的話,你們心心念念的熱修復應該就能成了。

之后我又看了下

dependencies:
  build_runner_core: any
  build_runner: any

在build_runner_core的main.dart,我看到PackageGraph如何對Package的解析。從build_runner中看到了builder執行的過程,本來想另開一篇水一下的,后面看到暴打小女孩已經寫過了Flutter 注解處理及代碼生成,感興趣的小伙伴可以自己去看一下。

現在知道了怎么解析項目結構以及引用的模塊,知道怎么解析一個dart代碼,寫法法路由就順利多了,下面直接上使用手冊。

描述

通過注解快速完成路由映射.

使用

增加引用

添加引用到dev_dependencies,及你需要注解的project/packages到pubspec.yaml

dev_dependencies:
  ff_annotation_route: latest-version

執行 flutter packages get 下載

添加注解

空構造

import 'package:ff_annotation_route/ff_annotation_route.dart';

@FFRoute(
  name: "fluttercandies://mainpage",
  routeName: "MainPage",
)
class MainPage extends StatelessWidget 
{
  // ...
}

帶參數構造

import 'package:ff_annotation_route/ff_annotation_route.dart';

@FFRoute(
  name: "fluttercandies://picswiper",
  routeName: "PicSwiper",
  argumentNames: ["index", "pics"],
  showStatusBar: false,
  pageRouteType: PageRouteType.transparent,
)
class PicSwiper extends StatefulWidget {
  final int index;
  final List<PicSwiperItem> pics;
  PicSwiper({this.index, this.pics});
  // ...
}

FFRoute

Parameter Description Default
name 路由的名字 (e.g., "/settings"). required
argumentNames 路由的參數的名字 (只能使用") -
showStatusBar 是否顯示狀態欄 true
routeName 用于埋點收集數據的頁面名字 ''
pageRouteType 路由的類型 (material, cupertino, transparent) -
description 路由的描述 ''
exts 其他擴展參數. -

生成文件

環境

添加dart的bin的路徑到你的系統 $PATH.

cache\dart-sdk\bin

更多信息

不清楚的可以看掘金

激活

pub global activate ff_annotation_route

執行命令

到你的項目根目錄下面執行.

ff_route <command> [arguments]

命令參數

可用的命令:

command name description
-h, --help 打印幫助信息.
-p, --path [arguments] 執行命令的目錄,沒有就是當前目錄.
-rc, --route-constants 是否在根項目中的 xxx_route.dart 生成全部路由的靜態常量
-rh, --route-helper 生成 xxx_route_helper.dart 來幫助你處理路由
-rn, --route-names 是否在根項目中的 xxx_route.dart 生成全部路由的名字
-s, --save 是否保存命令到本地,如果保存了,下一次就只需要執行ff_route就可以了
-na, --no-arguments FFRouteSettings 將沒有 arguments 這個參數,這個是主要是為了適配 Flutter 低版本
-g, --git package1,package2 是否掃描 git 引用的 package,你需要指定 package 的名字
--package 這個是否是一個 package
--no-is-initial-route FFRouteSettings 將沒有 isInitialRoute 這個參數,這個是主要是為了適配 Flutter 高版本
-o --output route和helper文件的輸出目錄路徑,路徑相對于主項目的lib文件夾
-rfo --routes-file-output routes 文件的輸出目錄路徑,路徑相對于主項目的lib文件夾

Main.dart

  • 如果運行的命令帶有參數 --route-helper , FFNavigatorObserver/FFRouteSettings
    將會生成在 xxx_route_helper.dart 中,用于協助追蹤頁面和設置狀態欄。

  • 如果運行的命令帶有參數 --route-helperFFTransparentPageRoute 將會生成在
    xxx_route_helper.dart 中,可以使用它來 push 一個透明的 PageRoute

Widget build(BuildContext context) {
    return OKToast(
        child: MaterialApp(
      title: 'ff_annotation_route demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      navigatorObservers: [
        FFNavigatorObserver(routeChange:
            (RouteSettings newRouteSettings, RouteSettings oldRouteSettings) {
          //you can track page here
          print(
              "route change: ${oldRouteSettings?.name} => ${newRouteSettings?.name}");
          if (newRouteSettings is FFRouteSettings &&
              oldRouteSettings is FFRouteSettings) {
            if (newRouteSettings?.showStatusBar !=
                oldRouteSettings?.showStatusBar) {
              if (newRouteSettings?.showStatusBar == true) {
                SystemChrome.setEnabledSystemUIOverlays(
                    SystemUiOverlay.values);
                SystemChrome.setSystemUIOverlayStyle(
                    SystemUiOverlayStyle.dark);
              } else {
                SystemChrome.setEnabledSystemUIOverlays([]);
              }
            }
          }
        })
      ],
      builder: (c, w) {
        ScreenUtil.instance =
            ScreenUtil(width: 750, height: 1334, allowFontScaling: true)
              ..init(c);
        var data = MediaQuery.of(c);
        return MediaQuery(
          data: data.copyWith(textScaleFactor: 1.0),
          child: w,
        );
      },
      initialRoute: Routes.FLUTTERCANDIES_MAINPAGE,// fluttercandies://mainpage
      onGenerateRoute: (RouteSettings settings) =>
          onGenerateRouteHelper(settings, notFoundFallback: NoRoute()),
    ),
  );
}

更多信息

Push

Push name

  Navigator.pushNamed(context, Routes.FLUTTERCANDIES_MAINPAGE /* fluttercandies://mainpage */);

Push name with arguments

參數必須是一個 Map<String, dynamic>

  Navigator.pushNamed(
    context,
    Routes.FLUTTERCANDIES_PICSWIPER, // fluttercandies://picswiper
    arguments: {
      "index": index,
      "pics": listSourceRepository
          .map<PicSwiperItem>((f) => PicSwiperItem(f.imageUrl, des: f.title))
          .toList(),
    },
  );

結語

不同于其他的路由注解方案,我加入了對埋點,全屏模式以及路由類型的處理。路由注解方案很多,找到一個合適自己的就好了,歡迎提問題。

最后放上 ff_annotation_route,歡迎加入Flutter Candies,一起生產可愛的Flutter 小糖果(QQ群:181398081)

最最后放上Flutter Candies全家桶,真香。

image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關聯任何信息和...
    九尾喵的薛定諤閱讀 3,206評論 0 2
  • 信步跨仙境 切切私語聲 公主會王子 眷屬應終成
    鄭峰_a14a閱讀 421評論 8 16
  • 每一朵花都是用全部的生命力在綻放
    余生唯愛因盡美閱讀 454評論 0 0
  • 去愛吧 像不曾受過傷一樣跳舞吧 像沒有人欣賞一樣唱歌吧 像沒有人聆聽一樣干活吧 像不需要錢一樣生活吧 像今天是末日一樣
    Crassus閱讀 257評論 0 0
  • 天蒙蒙亮,窗外的霓虹正漸漸地退去,主人起的早,穿好衣服到書房讀書,打開書桌上的節能燈,房間立刻溫暖明亮起來,底座精...
    孫丹丹86400閱讀 363評論 1 1