前言
既然要学习Flutter项目开发,那必然要制定项目规范,在过去的几年里,我们编写了大量的代码,发现代码可阅读性越来越低,一系列代码不规范问题给项目维护带来了额外的成本。在新项目的开端,我们将遵循这一套项目规范,期望编写出一致的、健壮的、简洁的代码。
规范
大驼峰
类、枚举、typedef和类型参数应该使用大驼峰命名法,每个单词的首字母大写,包括第一个单词
enum CheckType { ... }
class HomePage extends StatefulWidget { ... }
typedef StateSetter = void Function(VoidCallback fn);
小驼峰
类成员、顶级定义、变量、参数和命名参数应该使用小驼峰命名法,除了首个单词外每个单词的首字母大写
var newsDate = '';
static const String appLanguage = 'app_language';
void getFixedItem(int index, String iconName, String textName) { ... }
下划线
依赖库、源文件应该使用小写加下划线命名法,全部用小写字母,即使是首字母缩写也需要用下划线分割
import 'package:flutter_common/util/screen_adapter_util.dart';
more_page.dart
list_price.json
ic_new_house.png
避免缩写
除非缩写比未缩写的术语更常见,否则不要缩写。如果您缩写,请正确地将其大写
pageCount
buildRectangles
IOStream
HttpRequest
私有声明
前导下划线字符()表示成员对其库是私有的。这不仅仅是惯例,而是内置于语言本身。如果该变量或方法无需外部调用,那就加下换线(),更少暴露的公共接口更易于维护。
Map _newHouse;
class _HomePageState extends State<HomePage> { ... }
代码注释
你可以使用块注释(/…/)临时注释掉一段代码,其中类名和方法名请使用Doc注释///,其他注释都应该使用//
/// 取消计时器
_cancelTimer() {
if (_timer.isActive) {
// 取消计时
_timer.cancel();
}
}
默认值分隔符
由于遗留原因,Dart均允许“:”和“=”作为指定参数的默认值分隔符。为了与可选的位置参数保持一致,使用“=”
static String getImgPathNewHouse(String name, {String format = 'png'}) {
return 'assets/images/new_house/$name.$format';
}
不默认赋值null
如果参数是可选的,但没有给它一个默认值,则语言隐式地使用null作为默认值,因此不需要编写它
String? type; 而非 String? type = null;
不要使用new关键字
在Dart 2中,new关键字可以省略不写,效果等同于new,可以使得代码简洁
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar( ... ),
body: Container( ... ),
);
}
使用final关键字来创建只读属性
如果你不需要修改他的值,它应该是不可变的状态,请使用final进行修饰,这样将更易于维护
final Set<GlobalKey> _elements = HashSet<GlobalKey>();
资源文件目录及源文件命名规则
在assets资源目录下对不同类型的资源进行分类,区分不同类型资源;在同一类型资源目录下,按照不同模块新建目录,区分不同模块资源,目录命名统一使用单数而非复数。
图标命名:ic_功能名称, 图标命名:bg_功能名称
总结
当涉及到格式化和大小写哪个更好等具有争议性问题时,我们发现它是属于主观问题并且不可能解决,但我们知道保持一致在客观上是有帮助的。代码规范可以促进团队合作,减少bug,降低维护成本,并且有助于代码审查,养成代码规范的习惯,有助于程序员自身的成长。