Flutter代码规范优化记录

  • 自从把 Flutter SDK 中的 analysis_options.yaml copy 到项目根目录后就***,当时是 700 多个 error,警告记不清了,提示信息有 7k 个,总共花了一天半全部改完。

  • 所以还是得养成良好的代码编写习惯

字符串用单引号

除非你的字符串中有单引号—> ‘,不然整个字符串用单引号。

泛型规范

只要类的定义中有写泛型,或者一些方法中用到了泛型,那么在使用这些类或者调用这些方法的时候也一定要加上泛型

最常见的例子

1
2
3
List<String> list=<String>[];
Map<String,String> map=<String,String>{};
Future<void>

Flutter 中:

1
2
3
4
Navgator.pust<void>
showDialog<void>
Tween<double>
Tween<int>

根据具体场景添加泛型
在传递 List 或者 Map 的时候

1
2
<T>[]
<T,T>{}

前面的泛型也务必加上
[]也需要在前面加上泛型

省略 new 关键字

有 new 的都是祖传代码了,没啥细讲的.

不要省略对象的类型

也尽量不要用 var 与 dynamic

final 关键字

在任何时候使用新的变量,如果它不需要被二次修改,请一定加上 final 修饰

1
2
3
4
final String str='Nightmare';
for(final String str in xxx){

}

Map、List 的对象都是引用,类似于 C 语言中的指针,所以在定义后都是不会改变的

1
2
final List<int> list= <int>[];
final Map<String,dynamic> map=<String,dynamic>{};

const 修饰

1
2
3
4
const Duration();
const Text();
const Color(0xffff0000);
const EdgeInsets.only(bottom: 20.0);

一些嵌套对象的的 const

1
2
3
4
5
6
7
const Center(
child: SizedBox(
width: 80,
height: 80,
),
),
),

其中 SizedBox 的 const 不用加

if 与 for 语句的花括号

不管 if 条件后是单语句还是多条语句
都添加大括号{}

1
2
3
4
5
6
if(bool){
print('');
}
for(***){

}

官方代码也有很多单语句不加花括号的…

避免不必要的字符串插值

例子:

1
2
String number='Nightmare';
Text('$number')

优化:

1
2
String number='Nightmare';
Text(number)

字符串插值避免不必要的的大括号

例子:

1
2
int a;
String b='${a}';

优化:

1
2
int a;
String b='$a';

官方的有些代码都有这种情况

字符串相加可以省略加号

例子:

1
'str1'+'str2'

修改:

1
'str1' 'str2'

不要在列表里面使用相邻字符串

例子:

1
<String>['str1','str2' 'str3','str4']

你也许会想干嘛不写成
‘str2str3’
但有些场景如下

1
2
3
4
5
6
7
8
9
10
<String>[
'-c',
'''export PATH=/data/data/com.nightmare/files/usr/bin:\$PATH
mkdir /data/data/com.nightmare/files/home/$_index
busybox unzip -o $_filePath -d /data/data/com.nightmare/files/home/$_index
cd /data/data/com.nightmare/files/home/$_index
sh /data/data/com.nightmare/files/home/$_index/install.sh
rm -rf /data/data/com.nightmare/files/home/$_index
rm -rf $_filePath'''
],

如果写成单个字符串单行会特别长所以解决方法将整个字符串用’’’,所以有时候可以用三个单引号包起来

回调函数写明类型

例子

1
itemBuilder: (c, i) {}

优化

1
itemBuilder: (BuildContext context, int index) {}

为所有的方法写上类型

1
void function()

或者

1
Future<void> function() async

Flutter 被遗弃的接口

Theme 中

1
2
3
body1=>bodyText2
title=>headline6
subhead=>subtitle1

这只是我个人项目使用到的,其他的看源码就知道了

将条件语句转换成 if-else

1
2
3
bool isExist;
***
isExist?***:***;

优化

1
2
3
4
5
6
7
bool isExist;
***
if(isExist){

}else{

}

类的构造函数在所有子成员前面

先写构造,再写成员参数

如果有没有用到的包,请在代码顶部删除它

无详细解释

导包的排序

  • 有些编译器不能自动给你修复,需要你手动按照字母将导包的顺序排序

并遵循一下大前提如下:

  • dart sdk 内的库
  • flutter 内的库
  • 第三方库
  • 自己的库
  • 相对路径引用

先全部 import 再 export,不要交替进行

类的内部访问成员省略 this.

无详细解释

有一些不想要更改的规范

dart 官网有介绍,在使用以下方法时,异步比同步要慢得多

1
2
3
4
5
6
7
8
9
Directory.exists
Directory.stat
File.lastModified
File.exists
File.stat
FileSystemEntity.isDirectory
FileSystemEntity.isFile
FileSystemEntity.isLink
FileSystemEntity.type

但个人遇到的很多场景带 sync 的方法会把 UI 卡住,尤其是在这些方法短时间里频繁访问的情况,所以我注释掉了 analysis_options.yaml 的这一行。

最后

  • 有任何错误指出
  • 个人项目在 Flutter1.0 的正式版前就已经使用了,依稀记得是 0.7,当时编程基础所有的能力很不扎实(现在也差不多),所以有很多没能避免的地方,但我在知道怎么优化的时候,一定及时优化。
  • 可能大家没有体验过,一边学 Flutter 一边学 C 语言的 hello world 吧,所以说话与评价些许有些轻松。
  • 记录给需要的人,在这些场景代码编写规范。
作者

梦魇兽

发布于

2020-06-02

更新于

2023-03-11

许可协议

评论