Flutter代码规范优化记录

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

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

字符串用单引号

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

泛型规范

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

最常见的例子

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

Flutter中:

Navgator.pust<void>
showDialog<void>
Tween<double>
Tween<int>

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

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

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

省略new关键字

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

不要省略对象的类型

也尽量不要用var与dynamic

final关键字

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

final String str='Nightmare';
for(final String str in xxx){
    
}

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

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

const修饰

const Duration();
const Text();
const Color(0xffff0000);
const EdgeInsets.only(bottom: 20.0);

一些嵌套对象的的const

const Center(
    child: SizedBox(
        width: 80,
        height: 80,
        ),
    ),
),

其中SizedBox的const不用加

if与for语句的花括号

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

if(bool){
    print('');
}
for(***){
  
}

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

避免不必要的字符串插值

例子:

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

优化:

String number='Nightmare';
Text(number)

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

例子:

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

优化:

int a;
String b='$a';

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

字符串相加可以省略加号

例子:

'str1'+'str2'

修改:

'str1' 'str2'

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

例子:

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

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

<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'''
    ],

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

回调函数写明类型

例子

itemBuilder: (c, i) {}

优化

itemBuilder: (BuildContext context, int index) {}

为所有的方法写上类型

void function()

或者

Future<void> function() async

Flutter被遗弃的接口

Theme中

body1=>bodyText2
title=>headline6
subhead=>subtitle1

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

将条件语句转换成if-else

bool isExist;
***
isExist?***:***;

优化

bool isExist;
***
if(isExist){

}else{

}

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

先写构造,再写成员参数

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

无详细解释

导包的排序

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

并遵循一下大前提如下:

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

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

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

无详细解释

有一些不想要更改的规范

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

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吧,所以说话与评价些许有些轻松。
  • 记录给需要的人,在这些场景代码编写规范。