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

推荐阅读更多精彩内容