用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)系作者
  • 序言:七十年代末缠借,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宜猜,更是在濱河造成了極大的恐慌泼返,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姨拥,死亡現(xiàn)場離奇詭異绅喉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叫乌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門柴罐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人憨奸,你說我怎么就攤上這事革屠。” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵屠阻,是天一觀的道長红省。 經(jīng)常有香客問我,道長国觉,這世上最難降的妖魔是什么吧恃? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮麻诀,結(jié)果婚禮上痕寓,老公的妹妹穿的比我還像新娘。我一直安慰自己蝇闭,他們只是感情好呻率,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呻引,像睡著了一般礼仗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逻悠,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天元践,我揣著相機(jī)與錄音,去河邊找鬼童谒。 笑死单旁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饥伊。 我是一名探鬼主播象浑,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琅豆!你這毒婦竟也來了愉豺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趋距,失蹤者是張志新(化名)和其女友劉穎粒氧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體节腐,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年摘盆,在試婚紗的時候發(fā)現(xiàn)自己被綠了翼雀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡孩擂,死狀恐怖狼渊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤狈邑,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布城须,位于F島的核電站,受9級特大地震影響米苹,放射性物質(zhì)發(fā)生泄漏糕伐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一蘸嘶、第九天 我趴在偏房一處隱蔽的房頂上張望良瞧。 院中可真熱鬧,春花似錦训唱、人聲如沸褥蚯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赞庶。三九已至,卻和暖如春澳骤,著一層夾襖步出監(jiān)牢的瞬間尘执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工宴凉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誊锭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓弥锄,卻偏偏與公主長得像丧靡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子籽暇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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