Flutter项目规范

404 阅读3分钟

前言

既然要学习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,降低维护成本,并且有助于代码审查,养成代码规范的习惯,有助于程序员自身的成长。