Error Rules
在引用其他模块的头文件时,应该通过‘package:xxx’来引用(always_use_package_imports)
避免通过使用**lib/中的**
相对路径来引用其他模块的文件.
避免直接使用一个dynamic类型的对象(avoid_dynamic_calls (experimental))
不应该直接使用一个dynamic对象,包括直接获取一个dynamic对象的属性,或者直接对于一个dynamic对象调用方法,而是应该将他转换为一个特定的类型,再继续使用.
避免在ifelse中的else语句为空(avoid_empty_else)
避免else的语句为空.
在线上代码中应该避免使用print(avoid_print)
应该在正式环境的代码中去掉对print方法的调用.
避免使用相对路径引用(avoid_relative_lib_import)
避免在lib中使用相对路径的引用,而使用package.
在返回类型为future的方法中,避免返回null(avoid_returning_null_for_future)
在需要返回Future的方法中,不应该返回null。
避免使用慢速的异步io方法(avoid_slow_async_io)
避免使用 **dart:io**
中的异步慢速io方法,而使用他们对应的同步io方法.
避免在线上代码中使用toString()方法,而应该使用自定义的方法,来实现将类中数据转换成字符串.
避免参数的名称和类型的名称重名(avoid_types_as_parameter_name)
参数的名称不应该和任何一个已知的类重名.
不要在Flutter的web plugin外使用web库(avoid_web_libraries_in_flutter)
不要在仅可在web中使用的库在web插件外的地方使用.(**dart:html**
, **dart:js**
and **dart:js_util**
)
在使用stream时,使用完一定要对stream调用cancel方法(cancel_subscriptions)
要对StreamSubscription使用cancel方法,防止内存泄漏.
在使用sink时,使用完一定要调用close方法(close_sinks)
要对**dart.core.Sink 使用close方法,以防止内存泄漏**
.
阻止控制流进入finally语句中(control_flow_in_finally)
组织控制流进入finally语句中,这样会导致很难调试.
diagnostic应该覆盖所有的属性(diagnostic_describe_all_properties)
应该覆盖所有的公共属性在debug的方法中以便更好的进行调试.
空语句和误用分号很类似.
hash和==应该同时被覆盖或者改写(hash_and_equals)
永远同时覆盖 **hashCode**
如果覆盖 **==**
.
不要在条件判断中赋值或者对同一个条件判断两次(invariant_booleans (experimental))
条件判断语句中不应该永远是true或者false.
在迭代中不要使用contains来判断不相关的类型(iterable_contains_unrelated_type)
调用 Iterable.contains 会调用==而返回false.
在list中不要删除不相关的类型(list_remove_unrelated_type)
在list中删除不相关的类型会返回false,而这往往是开发者所未预料到的.
在判断语句中只进行真假的判断(literal_only_boolean_expressions)
判断语句中只进行真假的判断,而不要进行赋值等各种其他操作.
不要在list中连接字符串(no_adjacent_strings_in_list)
这个很有可能意味着忘记了使用逗号来分隔list中的元素.
不要再case中有重复的值(no_duplicate_case_value)
在switch-case语句中,case中的值不应该有重复的.
在creatState方法中不应该有任何逻辑(no_logic_in_create_state)
createState方法中只应该有创建state的方法调用,而不应该有其他的任何逻辑.
引用同一模块的头文件时,使用相对路径(prefer_relative_imports)
在引用同一模块下的其他 **lib/下的文件的头文件时,使用相对路径**
.
在void可以使用的时候,不要使用NULL(prefer_void_to_null)
不要使用Null类型,除非你确认你不希望使用void .
在复写==方法时,一定要判断传入的参数的类型(test_types_in_equals)
复写类的==方法时,一定要判断入参的类型,以防止传入null等.
在finally中不应该抛出error(throw_in_finally)
避免在finally中使用throw,这会导致代码的调试困难.
无用的代码应该及时删除(unnecessary_statements)
避免使用无意义的diamanté和避免使用无用的语句在代码中,并且应该及时删除.
不要使用==来比较两个无关的类(unrelated_type_equality_checks)
==来比较无关的两个类,有可能导致返回false,但是没法达到开发者的目的.
在同步方法中使用BuildContexts(use_build_context_synchronously (experimental))
如果在异步方法中使用 BuildContexts,可能会导致BuildContexts虽然已经被销毁,仍然被使用的情况.
在组件的初始化方法中一定要使用key(use_key_in_widget_constructors)
在组件的初始化方法中一定要使用key,并调用super将key传入super的初始化方法.
正则表达式的书写应该是有效的,否则在运行时会报错.
Only reference in scope identifiers in doc comments.
Avoid unsafe HTML APIs.
Style Rules
总是标明方法的返回类型(always_declare_return_types)
声明方法的返回类型.
控制语句的控制体总是新起一行(always_put_control_body_on_new_line)
在控制语句中,每一个控制体总是新起一行来实现.
将必传命名参数放在参数列表的第一位(always_put_required_named_parameters_first)
将必传命名参数放在第一位.
总是指定参数的类型(always_specify_types)
使用变量和参数时,总是明确的指定参数的类型.
使用override注解来覆盖父类的方法和参数(annotate_override)
使用override以防止参数被意外的覆盖.
在非必要的情况下避免使用dynamic作为返回值或者函数的参数(avoid_annotating_with_dynamic)
在非必要的情况下,不使用dynamic作为返回值或者函数参数的类型,可以直接省略类型.
在条件表达式中避免使用bool字面值(avoid_bool_literals_in_conditional_expressions)
在条件表达式中,避免直接使用true和false.
不要在catch中不指定exception的类型(avoid_catches_without_on_clauses)
以防止捕捉到其他非意料到的异常而未做正确处理.
不要显式的捕捉error(avoid_catching_errors)
Error和Exception不同,不应该主动的捕捉.Error可以在运行前提前检查并解决掉。
不要定义只有静态变量和静态方法的类(avoid_classes_with_only_static_members)
静态变量可以以常量来替代,静态方法可以以全局函数来替代.
不要检查类型是int或者double,应该检查num(void_double_and_int_checks)
编译成js的时候都会变成float类型.
不要对未标记为@immutable的类覆盖==和hashcode方法(avoid_equals_and_hash_code_on_mutable_classes)
这个操作可能引发未可知的问题.
通过双引号来消除字符串中的转义字符(avoid_escaping_inner_quotes)
双引号来引用字符串,可以不需要对字符进行转义.
在常量类中避免进行初始化(avoid_field_initializers_in_const_classes)
而直接通过get方法获取常量属性.
不要使用foreach来进行遍历(avoid_function_literals_in_foreach_calls)
在Dart中,如果要迭代序列,那么惯用的方法就是使用循环.
不要使用implement来实现一个覆盖了==方法的父类(avoid_implementing_value_types)
这样在子类中,父类的==实现并不会被继承.
不要显式的初始化一个变量为null(avoid_init_to_null)
可以不初始化它.
避免使用难以被转换为js的int数字(avoid_js_rounded_ints)
在编译成js的时候int和double会被转换为js中的number类型.
不要在一行中声明多个变量(avoid_multiple_declarations_per_line)
每一个变量应该单独一行来声明.
不要在自定义的==中判断是否等于null(avoid_null_checks_in_equality_operators)
只要判断类型是否相同,就能确定他是否是null了.
不要使用位置布尔参数(avoid_positional_boolean_parameters)
要是用命名布尔参数,否则很难辨认布尔参数的含义.
不要使用私有的typedef函数定义(avoid_private_typedef_functions)
只使用一次的 typedef 函数定义,可以直接使用内联函数.
不要重复设置参数的值(avoid_redundant_argument_values)
对于已经有默认值的函数可选参数,使用时不应该再重复设置和他默认值相同的值.
不要重命名覆盖函数的参数变量的名称(avoid_renaming_method_parameters)
应该变量的名称保持一致.
不要设置setters方法的返回值(avoid_return_types_on_setters)
因为setter方法不应该有返回值.
在返回类型为bool、double、int、num的函数中,不应该返回null(avoid_returning_null)
应该返回一个默认值当前类型值.
在无返回值的void函数中,不应该返回null(void_returning_null_for_void)
应该直接使用retrun即可.
避免在流式接口中返回this(avoid_returning_this)
直接使用..来实现流式接口.
不要只实现setters而不实现getters(avoid_setters_without_getters)
这样容易出现错误.
不要不使用类型参数的类型(avoid_shadowing_type_parameters)
在类中定义了类型参数,就应该在类中的方法中使用,而不应该使用其他类型参数.
avoid_single_cascade_in_expression_statements
Avoid single cascade in expression statements.
avoid_types_on_closure_parameter
Avoid annotating types for function expression parameters.
不要使用没有必要的containers(avoid_unnecessary_containers)
没有其他参数的containers没有任何作用,反而增加widget的层级.
不要在初始化方法中使用没必要的参数(avoid_unused_constructor_parameters)
初始化方法中的所有参数,都应该有用处,并被使用.
异步方法async应该有Future的返回类型(avoid_void_async)
异步方法不应该返回void类型,而是应该返回Future类型.
await方法只应该用在future上(await_only_future)
可以使用await在**Future<X>**
, **FutureOr<X>**
, **Future<X>?**
, **FutureOr<X>?**
and **dynamic或者null上**
对于extension应该使用驼峰命名(camel_case_extension)
使用驼峰命名规则来命名extension.
类名和typedef应该使用驼峰命名法(camel_case_types)
应该使用首字母大写的驼峰命名法而且不要有下划线.
当对同一个对象连续调用方法时,使用层叠样式(cascade_invocations)
使用..语法,对同一个对象连续调用方法.
不要将一个nullable对象强制转换为一个非空对象(cast_nullable_to_non_nullable (experimental))
转换后可能会导致不会做非空判断.
常量名称使用小写字母开头的驼峰命名(constant_identifier_names)
命名使用小写字母开头的驼峰命名.
总是在控制流中使用大括号来括住控制语句(curly_braces_in_flow_control_structures)
使用大括号来括住控制语句可以保证不出现悬垂语句.
类中的deprecated应该保持一致(deprecated_consistency)
类如果废弃他的初始化方法应该标识为废弃,属性废弃则初始化方法中对于此属性的引用应该废弃.
对于dart:的引用应该在其他引用之前(directives_ordering)
对于头文件的引用应该首先写dart库中的头文件.
不要使用空的catches block(empty_catches)
如果想要忽略它,应该异常的参数使用_来表示.如果是故意制造的异常,应该写注释。
不要使用大括号来括住空的初始化方法(empty_constructor_bodies)
要是用分号 **;**
而不是大括号 **{}来表示空的初始化方法体**
.
switch-case中应该列出case的所有可能(exhaustive_cases)
应该分别列出case中的所有能,并针对性的做处理.
文件名称应该以小写字母加下划线的规则来命名(file_names)
**代码文件的名称应该遵循lowercase_with_underscores**
.
不要引用其他package的lib/src文件夹下的文件(implementation_imports)
只应该引用lib文件夹下的文件,src是package的具体实现,可能随时被修改.
库的名称应该使用小写字母加下划线(library_names)
库的命名规则应该遵循 **lowercase_with_underscores**
.
引用库的前缀应该遵循小写字母没有下划线格式(library_prefixes)
使用 **lowercase_with_underscores**
规则import ‘dart:,math‘ as math.
不要在库的公开的API中使用私有类型(library_private_types_in_public_api)
避免在对外开放的API中使用似有类型.
非常量属性应该使用小写字母命名规范(non_constant_identifier_names)
非常量属性命名遵循 lowerCamelCase规范.
不要对一个可能为空的参数上使用是否为空的判断(null_check_on_nullable_type_parameter (experimental))
这种很容易出现错误不要使用T!而是使用T as W.
不要将null作为一个匿名函数传递给参数(null_closure)
当需要一个内明函数作为参数的时候不要直接传null .
不要设置局部变量的类型(omit_local_variable_types)
局部变量一般很容易从上下文中判断出他的类型.
不要定义只有一个成员的类(one_member_abstracts)
如果一个简单的函数定义可以替代就不要重新定义一个类.
只抛出error或者exception类型的异常(only_throw_errors)
只抛出 Exception 或者 Error或者他们子类的异常.
通常覆盖父类的属性都是错误的.
应该给package中的公共类提供文档(package_api_docs)
给公开的API提供文档注释.
应该给package中的类名添加前缀(package_prefixed_library_names)
添加包名.路径名.
不要给方法中的参数重新赋值(parameter_assignments)
这种做法很容易造成错误,除非你使用 ??=.
使用相邻字符串来连接字符串(prefer_adjacent_string_concatenation)
定义的相邻字符串会自动连接而不是用+.
初始化函数中在初始化列表中使用assert(prefer_asserts_in_initializer_lists)
而不是在初始化函数的函数体中做assert.
在assert中需要加一个提示信息(prefer_asserts_with_messag)
assert命中的时候并不是总是知道是什么原因造成的.
使用集合字面量(prefer_collection_literals)
使用[],{},使用[]或者{},但是LinkedHashSet和LinkedHashMap除外.
使用??=来代替判空(prefer_conditional_assignmen)
如果只是针对简单的判空赋值,直接使用??=.
使用const来修饰具有const初始化方法产生的对象(prefer_const_constructors)
尽量使用const来修饰.
对于不可变的类,需要使用const来修饰初始化方法(prefer_const_constructors_in_immutables)
对于声明为 **@immutable**
类的初始化方法需要设置为const.
对于常量声明使用const来修饰(prefer_const_declaration)
推荐使用const 而不是final 来修饰常量的声明.
在不可变类中的初始化参数设置为const(prefer_const_literals_to_create_immutables)
使用const 作为 @immutable 类的初始化参数.
使用初始化方法而不使用静态方法来创建类对象(prefer_constructors_over_static_methods)
使用初始化方法来创建类对象.
不要使用indexof来查看是否包含(prefer_contains)
使用contains来看**List**
和 **String**
是否包含某个对象
使用=将命名参数和他的默认值分开(prefer_equal_for_default_values)
使用 **=**
而不是:.
使用=>来表示简单的表达是函数体(prefer_expression_function_bodies)
使用 => 来作为一个简单的返回函数的函数体.
不修改的私有变量设置为final(prefer_final_field)
有利于编译器优化.
在foreach中的变量设置为final(prefer_final_in_for_each)
如果在循环体中不修改它.
尽量使用final来设置变量(prefer_final_locals)
如果不会被重新赋值,使用final.
在函数的参数变量中使用final(prefer_final_parameters)
只要函数中的参数不会在函数体中被修改.
通过遍历来创建map时最好使用for(prefer_for_elements_to_map_fromIterable)
使用for循环来进行遍历.
如果你准备对循环的每个变量使用某一个方法使用foreach(prefer_foreach)
使用 **forEach**
来对所有的元素使用方法.
使用函数声明将函数绑定到名称(prefer_function_declarations_over_variables)
而不是使用变量来赋值.
使用=号来作为函数的别名(prefer_generic_function_type_aliases)
而不是用直接命名.
在build方法中尽量使用ifelse而不使用三目运算符(prefer_if_elements_to_conditional_expressions)
尽量使用ifelse.
使用??来作为判空进行赋值操作(prefer_if_null_operators)
而不是使用if来进行判空操作.
尽可能使用初始化来给类属性赋值(prefer_initializing_formals)
使用初始化形式可以使得你的代码更加简洁.
在初始化的时候设置元素而不是用add(prefer_inlined_adds)
尽可能在初始化的时候设置所有元素.
尽量使用整数赋值而不要使用对应的double数字赋值(prefer_int_literals)
如果整数能满足需求就不要用double数字来赋值.
使用变量来组合字符串而不是+(prefer_interpolation_to_compose_strings)
直接在字符串中加入变量.
使用方法isempty而不是查询它的长度(prefer_is_empty)
对于集合来说使用isempty来判断是否无元素.
使用方法isnotempty而不是isempty取反(prefer_is_not_empty)
对于集合使用 **isNotEmpty**
.
使用is!而不是反is(prefer_is_not_operator)
使用 is! 操作符.
使用whereType按照类型过滤集合(prefer_iterable_whereType)
而不是使用where然后在遍历的过程中对类型做检查.
使用 mixins.
在对一个对象使用方法之前使用?判断对象是否为空(prefer_null_aware_method_calls)
使用?.来调用方法,而不是if.
使用?.来判空(prefer_null_aware_operators)
使用?.来调用方法,而不是if.
使用扩展运算符...来扩展集合(prefer_spread_collections)
尽量使用...来将一个集合合并入另一个集合.
未在定义的时候初始化的变量应该指明类型(prefer_typing_uninitialized_variables)
否则很容易出现错误.
在deprecation中写明信息(provide_deprecation_message)
通过 @Deprecated("message")来说明过期的信息.
对所有的公共的api变量输出文档(public_member_api_docs)
说明所有的公共变量.
不要创建递归的getter(recursive_getters)
这通常说明是写错了.
使用sizedbox来替换container来作为空白区域(sized_box_for_whitespace)
SizedBox 比container更加轻量级.
使用///来作为注释(slash_for_doc_comments)
使用 /// 作为文档注释.
在widget创建过程中将child属性放在最后(sort_child_properties_last)
在widget的创建过程中child的属性的赋值放在最后.
类中的构造方法放在第一位(sort_constructors_first)
构造方法放在其他属性之前.
未命名的构造方法放在第一位(sort_unnamed_constructors_first)
先是未命名的然后是命名的.
在公共的API中指定参数的类型(type_annotate_public_apis)
指定参数的类型.
初始化参数如果是类中的属性不需要指定类型(type_init_formals)
不要设置构造方法中的初始化属性的类型.
在异步方法中的Future应该使用awaited或者标记为unawaited(unawaited_future)
否则很容易出现异步的错误.
不要返回一个awaited的表达式(unnecessary_await_in_return)
在返回表达式中不要使用awaited关键字.
不要在字符串中使用不必要的大括号(unnecessary_brace_in_string_interps)
有的字符串组合没必要用大括号.
不要使用没必要的const(unnecessary_const)
避免在一个 const上下文中重复使用 const.
对于局部变量不要使用final(unnecessary_final)
使用var更短,而且也没有改变意思.
不使用没必要的getter和setter(unnecessary_getters_setter)
没必要为了安全而使用getter和setter.
当可以使用闭包是,不要使用匿名函数(unnecessary_lambdas)
闭包可以直接调用,而不需要使用复杂的匿名函数.
创建实例不需要使用new.
不要使用没必要的null检测(unnecessary_null_checks (experimental))
如果可以接受非空的参数.
. 如果可以接受空参数,
对于初始化未非空的final变量不要定义为可空类型(unnecessary_nullable_for_final_variable_declarations (experimental))
肯定会是一个非空类型.
不要使用没必要的overrides(unnecessary_overrides)
不要在一个只调用super方法中的override中使用overrides.
不要使用没必要的小括号(unnecessary_parenthesis)
没必要的小括号要被移除.
不使用没必要的raw字符串(unnecessary_raw_strings)
没必要的raw字符串应该不使用.
不要使用没必要的转义符(unnecessary_string_escape)
删除没必要的转义字符.
不要使用没必要的this(unnecessary_this)
除非是为了防止被覆盖.
使用8位16进制表示颜色(use_full_hex_values_for_flutter_colors)
使用8位16进制数表示颜色(0xFFFFFFFF) .
使用??来将null转换为布尔值(use_if_null_to_convert_nulls_to_bools)
使用??true 或者false.
使用isEven或者isodd来判断奇偶(use_is_even_rather_than_modulo)
而不是判断% 2的结果.
使用late来定义非空的私有变量(use_late_for_private_fields_and_variables (experimental))
如果没有被初始化.
使用系统已经定义好的常量值(use_named_constants)
而不是自己设置一个值.
使用raw string来避免使用转义符(use_raw_strings)
如果字符串需要转义使用r'fsf / $'.
使用rethrow再次抛出异常(use_rethrow_when_possible)
当在捕获异常中有遇到异常使用rethrow.
使用setter点方法修改属性而不是直接调用方法(use_setters_to_change_properties)
使用rect.width = 3 而不是rect.setWidth(3).
使用stringbuffer来组合字符串(use_string_buffers)
string buffers 更加高效.
Use throwsA matcher instead of fail().
Start the name of the method with to/_to or as/_as if applicable.
always_require_non_null_named_parameters
Specify **@required**
on named parameters without defaults.
Avoid using **as**
.
不要使用fromEnvironment和hasEnvironment(do_not_use_environment)
可能容易引起误解.
不要给void类型的变量赋值.
应该遵循flutter的todo样式(flutter_style_todos)
Use Flutter TODO format: // TODO(username): message, https://URL-to-issue.
尽量将返回语句和赋值语句合并返回成一个语句返回(join_return_with_assignment)
返回语句和赋值语句合并成一个语句一起返回.
多行字符串应该新起一行(leading_newlines_in_multiline_strings)
比较易读.
在switch-case中不要使用default(no_default_cases (experimental))
每一个case都应该单独处理.
每行不超过80个字符(lines_longer_than_80_chars)
避免超过 80 个字符.
在连接字符串的时候应该加入空格(missing_whitespace_between_adjacent_strings)
防止字符串连接过程中遗忘.
不要在toString方法使用runtimeType方法(no_runtimeType_toString)
因为 runtimeType比较耗费时间,除非你不在乎时间和效率.
内置类型是幂等的有些操作是多余的(noop_primitive_operations)
删除相关的幂等操作.
prefer_bool_in_asserts (deprecated)
Prefer using a boolean as the assert condition.
推荐使用双引号来修饰字符串(prefer_double_quotes)
Prefer double quotes where they won't require escape sequences.
Only use double quotes for strings containing single quotes.
require_trailing_commas (experimental)
Use trailing commas for all function calls and declarations.
Place the **super**
call last in a constructor initialization list.
tighten_type_of_initializing_formals
Tighten type of initializing formal.
unnecessary_null_aware_assignments
Avoid null in null-aware assignment.
unnecessary_null_in_if_null_operators
Avoid using **null**
in **if null**
operators.
use_function_type_syntax_for_parameters
Use generic function type syntax for parameters.
unnecessary_string_interpolations
Unnecessary string interpolation.
Pub Rules
依赖的库应该在dependcies中指定版本号(depend_on_referenced_packages)
以防止大版本号的迁移导致出现问题.
给package命名应该使用小写加下划线(package_names)
package的名称应该遵循 **lowercase_with_underscores**
.
Sort pub dependencies.