用analyzer提高Flutter项目的代码质量

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

The analysis options file
检查器会根据项目根目录下的分析脚本执行检查, 该文件通常会与pubspec文件处于同一层级.
老版本的分析脚本命名为.analysis_options, 没有yaml后缀, 新版本统一命名为: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语言在统一代码规范这方面做的还是比较完善的,不仅有官方文档 effective-dart 指导我们写出优雅的dart代码,更是提供了像eslint(写过js/ts的应该都知道)一样的工具linter来检查我们的代码是否符合规范。当然,检查项是可以配置的,这个后面再说,我们先来介绍如何使用官方提供的工具。

使用工具检查代码规范

首先,我们需要在项目的根目录下添加analysis_options.yaml文件,再次确认下这个文件应该跟pubspec.yaml在同一级目录下(不要嫌啰嗦)。文件添加好了,那应该怎么写配置的内容呢?这里有三个预设可供选择:

我们以pendantic为例,首先在pubspec.yaml文件的dev_dependencies下添加pendantic库,接着运行pub get将该库加载到项目中。

dev_dependencies:
  pedantic: ^1.9.0

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

include: package:pedantic/analysis_options.yaml

当然也可以像下面这样写,指定具体的options版本号:

include: package:pedantic/analysis_options.1.9.0.yaml

通过查看pedantic库的代码结构也能够看出analysis_options.yaml里一直是引用最新的预设文件。

image.png

第一种引用option的方式可能会在库更新的时候带来新版本的option文件,这样的话有可能会带来新的错误警告信息,而第二种引用指定版本option的方式会比较的稳定,这个大家选择合适自己的就好(星座决定选择,手动滑稽一下)。

配置好analysis_options文件后我们就可以在Android Studio的Dart Analysis下看到提示了,鼠标点击具体条目可以跳转到具体代码进行修改调整。(VS Code应该会在PROBLEMS下面看到相应的提示)

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
复制代码
  • include : 指定引用第三方库中预设文件的路径
  • analyzer : 配置static analysis的条目,包括启用更严格的类型检查,排除文件,忽略特定规则,更改规则的严重程度等。
  • linter : 配置linter规则

需要注意:不要在YAML文件中使用制表符,而是要用2个空格来表示每个缩进级别。

启用更严格的类型检查

analyzer:
  strong-mode:
    implicit-casts: false
    implicit-dynamic: false
复制代码

我们可以使用implicit-casts和implicit-dynamic这两个配置项来启用更严格的类型检查,他们的默认值都为true,可以组合使用,也可以分开使用。

  • implicit-casts的值为false时,可以确保类型推断引擎不会隐式转换成具体的数据类型。
  • implicit-dynamic的值为false时, 可以确保类型推断引擎在无法确定具体的数据类型时不会转换成动态类型。

这个大家可以设置一下试试,99%的人应该会收获一堆错误,然后开始怀疑自己写的是什么粑粑。。。。

定制自己的linter规则

linter:
  rules:
    - annotate_overrides
    - await_only_futures
    - camel_case_types
    - cancel_subscriptions
复制代码

按照上面的格式,可以根据实际需要添加自己的linter规则, dart-lang.github.io/linter/lint… 这里可以查看所有的linter规则,下面标注的标签会很清楚的标注每条规则的所在以及类别(例如:style)

image.png

但是如果你要禁用前面通过include引入的linter规则,则需要下面的配置格式

include: package:pedantic/analysis_options.1.9.0.yaml

linter:
  rules:
    avoid_shadowing_type_parameters: false
    await_only_futures: true
复制代码

当然也可以启用新的规则。这里需要注意的是,以上两种配置linter的方式不能混用。

排除文件

有些时候我们需要排除一些文件,比如json_serializable库生成的.g.dart文件,这时候就需要配置exclude,可以指定具体文件,也可以指定一类文件或者这个文件夹下的所有文件,所以说这个还是比较灵活的。

analyzer:
  exclude:
    - lib/http_client.dart
    - lib/models/*.g.dart
    - lib/mock/**
复制代码

忽略特定规则

我们可以忽略指定的linter规则,配置样式如下:

analyzer:
  errors:
    todo: ignore
复制代码

更改规则的严重程度

我们也可以全局更改指定规则的严重程度,配置样式如下:

analyzer:
  errors:
    invalid_assignment: warning
    missing_return: error
    dead_code: info
复制代码

IDE的提示修复功能

不管是VS Code 还是Android Studio,提示错误的同时一般都会带着修复提示的。


image.png

鼠标点点就能搞定大部分的警告,strong-mode开启的话另说,不是很强迫症的话可以忽略这个选项。

结束语

既然dart自带的代码规范功能这么强大,我们也不能浪费了google工程师们的一片良苦用心。简单的设置一下就可以让代码规范很多,赶快动手试试吧。

Auto-fix suggestions

不过在加了analyzer以后我发现VSCode出现了几百个warning, 大部分warning都有简单的fix方法(比如给Text("foo")加个const之类的). 虽然只要点一下就能fix, 点几百下也实在是太麻烦了...

搜索一下以后发现了解决办法: https://stackoverflow.com/a/62664168

首先用dartfmt可以解决一些简单的格式问题:

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

要应用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

但我发现pedantic的检查确实不如lint严格(cf. 二者的比较), 所以我并没有直接用--pedantic.

但是, 我们依然可以用dartfix来fix某一类问题(需要先确认某个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

用类似的方式, 就可以快速应用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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容