用analyzer提高Flutter項(xiàng)目的代碼質(zhì)量

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

The analysis options file
檢查器會根據(jù)項(xiàng)目根目錄下的分析腳本執(zhí)行檢查, 該文件通常會與pubspec文件處于同一層級.
老版本的分析腳本命名為.analysis_options, 沒有yaml后綴, 新版本統(tǒng)一命名為:analysis_options.yaml

image.png

檢查器會使用#1檢查other package和other other package, 使用#2檢查my package.

https://github.com/flutter/flutter/blob/flutter-1.22-candidate.13/packages/flutter/lib/analysis_options_user.yaml

https://blog.csdn.net/hdwhappy/article/details/113946151

前言

Dart語言在統(tǒng)一代碼規(guī)范這方面做的還是比較完善的,不僅有官方文檔 effective-dart 指導(dǎo)我們寫出優(yōu)雅的dart代碼,更是提供了像eslint(寫過js/ts的應(yīng)該都知道)一樣的工具linter來檢查我們的代碼是否符合規(guī)范。當(dāng)然,檢查項(xiàng)是可以配置的,這個后面再說,我們先來介紹如何使用官方提供的工具。

使用工具檢查代碼規(guī)范

首先,我們需要在項(xiàng)目的根目錄下添加analysis_options.yaml文件,再次確認(rèn)下這個文件應(yīng)該跟pubspec.yaml在同一級目錄下(不要嫌啰嗦)。文件添加好了,那應(yīng)該怎么寫配置的內(nèi)容呢?這里有三個預(yù)設(shè)可供選擇:

我們以pendantic為例,首先在pubspec.yaml文件的dev_dependencies下添加pendantic庫,接著運(yùn)行pub get將該庫加載到項(xiàng)目中。

dev_dependencies:
  pedantic: ^1.9.0

然后我們在analysis_options.yaml文件中添加如下配置:

include: package:pedantic/analysis_options.yaml

當(dāng)然也可以像下面這樣寫,指定具體的options版本號:

include: package:pedantic/analysis_options.1.9.0.yaml

通過查看pedantic庫的代碼結(jié)構(gòu)也能夠看出analysis_options.yaml里一直是引用最新的預(yù)設(shè)文件。

image.png

第一種引用option的方式可能會在庫更新的時候帶來新版本的option文件,這樣的話有可能會帶來新的錯誤警告信息,而第二種引用指定版本option的方式會比較的穩(wěn)定,這個大家選擇合適自己的就好(星座決定選擇,手動滑稽一下)。

配置好analysis_options文件后我們就可以在Android Studio的Dart Analysis下看到提示了,鼠標(biāo)點(diǎn)擊具體條目可以跳轉(zhuǎn)到具體代碼進(jìn)行修改調(diào)整。(VS Code應(yīng)該會在PROBLEMS下面看到相應(yīng)的提示)

image.png

配置analysis_options.yaml文件

include: package:pedantic/analysis_options.1.9.0.yaml

analyzer:
  exclude: [build/**]
  strong-mode:
    implicit-casts: false

linter:
  rules:
    - camel_case_types
復(fù)制代碼
  • include : 指定引用第三方庫中預(yù)設(shè)文件的路徑
  • analyzer : 配置static analysis的條目,包括啟用更嚴(yán)格的類型檢查,排除文件,忽略特定規(guī)則,更改規(guī)則的嚴(yán)重程度等。
  • linter : 配置linter規(guī)則

需要注意:不要在YAML文件中使用制表符,而是要用2個空格來表示每個縮進(jìn)級別。

啟用更嚴(yán)格的類型檢查

analyzer:
  strong-mode:
    implicit-casts: false
    implicit-dynamic: false
復(fù)制代碼

我們可以使用implicit-casts和implicit-dynamic這兩個配置項(xiàng)來啟用更嚴(yán)格的類型檢查,他們的默認(rèn)值都為true,可以組合使用,也可以分開使用。

  • implicit-casts的值為false時,可以確保類型推斷引擎不會隱式轉(zhuǎn)換成具體的數(shù)據(jù)類型。
  • implicit-dynamic的值為false時, 可以確保類型推斷引擎在無法確定具體的數(shù)據(jù)類型時不會轉(zhuǎn)換成動態(tài)類型。

這個大家可以設(shè)置一下試試,99%的人應(yīng)該會收獲一堆錯誤,然后開始懷疑自己寫的是什么粑粑。。。。

定制自己的linter規(guī)則

linter:
  rules:
    - annotate_overrides
    - await_only_futures
    - camel_case_types
    - cancel_subscriptions
復(fù)制代碼

按照上面的格式,可以根據(jù)實(shí)際需要添加自己的linter規(guī)則, dart-lang.github.io/linter/lint… 這里可以查看所有的linter規(guī)則,下面標(biāo)注的標(biāo)簽會很清楚的標(biāo)注每條規(guī)則的所在以及類別(例如:style)

image.png

但是如果你要禁用前面通過include引入的linter規(guī)則,則需要下面的配置格式

include: package:pedantic/analysis_options.1.9.0.yaml

linter:
  rules:
    avoid_shadowing_type_parameters: false
    await_only_futures: true
復(fù)制代碼

當(dāng)然也可以啟用新的規(guī)則。這里需要注意的是,以上兩種配置linter的方式不能混用。

排除文件

有些時候我們需要排除一些文件,比如json_serializable庫生成的.g.dart文件,這時候就需要配置exclude,可以指定具體文件,也可以指定一類文件或者這個文件夾下的所有文件,所以說這個還是比較靈活的。

analyzer:
  exclude:
    - lib/http_client.dart
    - lib/models/*.g.dart
    - lib/mock/**
復(fù)制代碼

忽略特定規(guī)則

我們可以忽略指定的linter規(guī)則,配置樣式如下:

analyzer:
  errors:
    todo: ignore
復(fù)制代碼

更改規(guī)則的嚴(yán)重程度

我們也可以全局更改指定規(guī)則的嚴(yán)重程度,配置樣式如下:

analyzer:
  errors:
    invalid_assignment: warning
    missing_return: error
    dead_code: info
復(fù)制代碼

IDE的提示修復(fù)功能

不管是VS Code 還是Android Studio,提示錯誤的同時一般都會帶著修復(fù)提示的。


image.png

鼠標(biāo)點(diǎn)點(diǎn)就能搞定大部分的警告,strong-mode開啟的話另說,不是很強(qiáng)迫癥的話可以忽略這個選項(xiàng)。

結(jié)束語

既然dart自帶的代碼規(guī)范功能這么強(qiáng)大,我們也不能浪費(fèi)了google工程師們的一片良苦用心。簡單的設(shè)置一下就可以讓代碼規(guī)范很多,趕快動手試試吧。

Auto-fix suggestions

不過在加了analyzer以后我發(fā)現(xiàn)VSCode出現(xiàn)了幾百個warning, 大部分warning都有簡單的fix方法(比如給Text("foo")加個const之類的). 雖然只要點(diǎn)一下就能fix, 點(diǎn)幾百下也實(shí)在是太麻煩了...

搜索一下以后發(fā)現(xiàn)了解決辦法: https://stackoverflow.com/a/62664168

首先用dartfmt可以解決一些簡單的格式問題:

# simple style/format fixes
$ dartfmt --fix --overwrite --follow-links .

要應(yīng)用analyzer的fix, 需要使用dartfix. 不過它目前只支持pedantic, 不能直接用analysis_options.yaml的配置:

# install dartfix:
$ pub global activate dartfix
# Use dartfix to auto-apply pedantic suggestions:
$ dartfix --pedantic --excludeFix unnecessary_this lib/ --fix prefer_const_declarations --overwrite

但我發(fā)現(xiàn)pedantic的檢查確實(shí)不如lint嚴(yán)格(cf. 二者的比較), 所以我并沒有直接用--pedantic.

但是, 我們依然可以用dartfix來fix某一類問題(需要先確認(rèn)某個fix是否被dartfix支持). 比如我看到很多sort_child_properties_last的建議, 于是可以:

# Check if the "sort_child_properties_last" lint is supported by dartfix:
$ dartfix -h | grep sort_
? sort_child_properties_last
# This fix is available ==> Apply it with dartfix:
$ dartfix --fix sort_child_properties_last  lib/ --overwrite

用類似的方式, 就可以快速應(yīng)用linter的建議:

$ dartfix --fix prefer_const_constructors  lib/ --overwrite
$ dartfix --fix prefer_const_declarations  lib/ --overwrite
$ dartfix --fix prefer_final_locals  lib/ --overwrite

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

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