Flutter编程规范

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方法.

t)方法(avoid_type_to_string)

避免在线上代码中使用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的方法中以便更好的进行调试.

不要写空语句(empty_statements)

空语句和误用分号很类似.

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的初始化方法.

正则表达式应该是有效的(valid_regexp

正则表达式的书写应该是有效的,否则在运行时会报错.

comment_references

Only reference in scope identifiers in doc comments.

unsafe_html

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**, **FutureOr**, **Future?**, **FutureOr?** 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或者他们子类的异常.

不要覆盖父类的属性(overridden_fields)

通常覆盖父类的属性都是错误的.

应该给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然后在遍历的过程中对类型做检查.

使用mixin来混入(prefer_mixin)

使用 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(unnecessary_new)

创建实例不需要使用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_test_throws_matchers

Use throwsA matcher instead of fail().

use_to_and_as_if_applicable

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_as (deprecated)

Avoid using **as**.

不要使用fromEnvironment和hasEnvironment(do_not_use_environment)

可能容易引起误解.

不要给void类型的变量赋值(void_checks)

不要给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.

prefer_single_quotes

Only use double quotes for strings containing single quotes.

require_trailing_commas (experimental)

Use trailing commas for all function calls and declarations.

super_goes_last (deprecated)

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

Sort pub dependencies.

你可能感兴趣的:(Flutter编程规范)