APP的Flutter代碼規范實踐

起源

做為跨平臺的移動端解決方案,Flutter大大提高了移動端的開發效率,但是由于很多開發者都是從原來做原生的iOS或者Android開發轉而成為Flutter開發者,而移動端的原生開發語言OC/Swift/Java/Kotlin的代碼規范千差萬別。那如何在Flutter開發過程中,統一代碼規范,提高代碼質量就是一個不小的問題。

Dart代碼規范

Flutter的開發語言Dart有官方的代碼靜態檢查工具—lints,同時lints中內置了上百條的代碼規范,檢查的規范類別包括:可能的拼寫錯誤、代碼風格和代碼的布局等等。這些規范分為兩類:Core lints(核心規范)、Recommended lints(推薦規范)。

Core lints幫助識別出可能在代碼運行時帶來嚴重問題的代碼。所有的代碼應該都通過這些代碼規范檢查。

Recommended lints 包含Core lints,除了Core lints的檢查外,Recommended lints主要是為了規范代碼的風格和布局,讓開發者以一種風格來開發Dart工程。

除了預定義的這兩種規范,開發者還可以在lints中自定義規范。

Flutter代碼規范

雖然Dart有自己的代碼檢查規范,但是Flutter官方更推薦使用為了Flutter而定制的代碼靜態檢查工具—flutter lints。Flutter lints包含了一系列的開發Flutter app、package和plugin的推薦代碼規范。他是在上面所說的Dart的Recommended lints的基礎上進行的改進和對Flutter的適配。

對于在使用Flutter 2.3.0以上的SDK通過flutter creat創建的Flutter app、package和plugin中,flutter lints默認會集成到代碼里。

對于已經存在的Flutter 工程來說,集成flutter lints也是非常簡單的。

  1. 在Flutter工程的目錄下,運行如下命令
flutter pub add –dev flutter_lints
  1. 在flutter工程的根目錄下創建一個名為analysis_option.yaml的文件,并且在文件中輸入 include: package:flutter_lints/flutter.yaml

下面是一個analysis_option.yaml文件的例子:

# This file configures the analyzer, which statically analyzes Dart code to

# check for errors, warnings, and lints.

#

# The issues identified by the analyzer are surfaced in the UI of Dart-enabled

# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be

# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,

# packages, and plugins designed to encourage good coding practices.

include: package:flutter_lints/flutter.yaml

linter:

  # The lint rules applied to this project can be customized in the

  # section below to disable rules from the `package:flutter_lints/flutter.yaml`

  # included above or to enable additional rules. A list of all available lints

  # and their documentation is published at

  # https://dart-lang.github.io/linter/lints/index.html.

  #

  # Instead of disabling a lint rule for the entire project in the

  # section below, it can also be suppressed for a single line of code

  # or a specific dart file by using the `// ignore: name_of_lint` and

  # `// ignore_for_file: name_of_lint` syntax on the line or in the file

  # producing the lint.

  rules:

    # avoid_print: false  # Uncomment to disable the `avoid_print` rule

    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule

# Additional information about this file can be found at

# https://dart.dev/guides/language/analysis-options

增加規則

除了使用flutter lints中的默認規則,開發者也可以增加一些規則,常見的規則可以在Flutter編程規范中有詳細闡述。這些規則中,可能有些規則之間是相互沖突的。某些規則可能更適合于package的開發者,有些可能更適合于flutter app的開的者。

在默認的規則中,代碼檢查的規則如下:

include: package:lints/recommended.yaml linter: rules:

 - avoid_print

 - avoid_unnecessary_containers

 - avoid_web_libraries_in_flutter

 - no_logic_in_create_state

 - prefer_const_constructors

 - prefer_const_constructors_in_immutables

 - prefer_const_declarations

 - prefer_const_literals_to_create_immutables

 - sized_box_for_whitespace

 - use_full_hex_values_for_flutter_colors

 - use_key_in_widget_constructors

也就是Dart的recommended規則增加了11項,如果開發者想要增加規則,只需要在analysis_option.yaml文件中的rules中,增加規則名稱,并設置為true。例如:

prefer_single_quotes: true

刪除規則

同樣也可以刪除默認的規則中的某些規則,或者讓他不起效,只需要在analysis_option.yaml文件中的rules中,增加規則名稱,并設置為false。例如:

avoid_print: false

將某些文件排除在代碼檢查之外

同樣我們可以將某些文件排除在代碼規則檢查之外,我們可以在analyzer中添加exclude,例如:

analyzer:
  exclude:
      - lib/client.dart 
     - lib/server/*.g.dart 
     - test/_data/**

APP的代碼規則實踐

在默認規則下,我們發現了不少代碼問題,特別是因為我們的代碼剛遷移到Flutter 2.0的空安全,其中不少和空安全的規則有關。在代碼的根目錄下運行,dart analyze,我們盡可以看到APP中的常見的違反代碼規則的地方:

不必要的冗余代碼:

  1. 創建類的實例不需要使用new(unnecessary_new)

  2. 除了防止被覆蓋,使用類的屬性時,不需要使用this來修飾

  3. 在對象不可能為null的情況下,不需要使用非空判斷(主要來源于空安全的轉換過程中,有些無用代碼未被刪除)

Dart 2.0的新規則的采用:

  1. 在函數中應該使用=將命名參數和他的默認值分開,而在Dart 2.12之前一直是使用冒號(:)

  2. 使用isEmpty來判斷集合中是否存在元素,而不是使用length

  3. 函數的集合類型的入參應該明確指出集合中的對象類型

  4. 在async函數中,調用返回Future的方法時,必須要在調用前明確指出,是await還是unawait

  5. 避免在forEach中使用簡寫函數字面量,而是應該使用for( in )

  6. 應該總是在函數中定義函數的返回類型

在剛開始制定代碼規范的時候,默認的代碼規范已經能滿足我們的基礎需求了。但是隨著開發的不斷深入,規則需要隨之而進行不斷的完善和改進,刪除很多并不必要的規則。制定代碼規范不是為了制定規范而規范,而是為了提高代碼質量和代碼的可維護性。規則制定完之后,當然就需要盡最大的努力保證規則的執行。目前我們也在考慮在CI中加入代碼規范的檢查。通過持續集成快速檢測,實時將結果反饋給代碼的對應負責人,降低規范落地的成本。代碼是研發團隊的核心資產,需要我們共同守護。

參考文獻:

https://dart.dev/tools#ides-and-editors

https://dart-lang.github.io/linter/lints/index.html

https://dart.dev/guides/language/analysis-options

https://dart.dev/tools/linter-rules

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

推薦閱讀更多精彩內容