Flutter代码规范优化记录

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

  • 因此仍是得养成良好的代码编写习惯bash

字符串用单引号

除非你的字符串中有单引号---> ',否则整个字符串用单引号。异步

泛型规范

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

最多见的例子函数

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

Flutter中:优化

Navgator.pust<void>
showDialog<void>
Tween<double>
Tween<int>
复制代码

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

<T>[]
<T,T>{}
复制代码

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

省略new关键字

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

不要省略对象的类型

也尽可能不要用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吧,因此说话与评价些许有些轻松。
  • 记录给须要的人,在这些场景代码编写规范。