字符串
两个常量字符串(不是变量,是放在引号中的字符串),你不需要使用 +
来连接它们。
推荐的写法
print(
'ERROR: Parts of the spaceship are on fire. Other '
'parts are overrun by martians. Unclear which are which.');
不推荐的写法
print('ERROR: Parts of the spaceship are on fire. Other ' +
'parts are overrun by martians. Unclear which are which.');
不要在字符串中使用不必要的大括号
如果要插入是一个简单的标识符,并且后面没有紧跟着的字母,则应省略 {}
推荐的写法
'Hi, $name!'
"Wear your wildest $decade's outfit."
//标识符后面有紧跟着的字母了 加上大括号用以区分
'Wear your wildest ${decade}s outfit.'
不推荐的写法
'Hi, ${name}!'
"Wear your wildest ${decade}'s outfit."
布尔值
使用? ?将空值转换为布尔值。
当表达式的值可以为真、假或null,并且您需要将结果传递给不接受null的对象时,此规则适用。一个常见的情况是一个判断空值的方法调用被用作条件:
不推荐的写法
if (optionalThing?.isEnabled) {
print("Have enabled thing.");
}
如果optionalThing为空,此代码将抛出异常。(if只支持判断bool值,不支持null)要解决这个问题,您需要将null值“转换”为true或false。虽然您可以使用==来完成此操作,但我们建议使用?? :
推荐的写法
//如果你想要optionalThing是空值时返回false
optionalThing?.isEnabled ?? false;
//如果你想要optionalThing是空值时返回true
optionalThing?.isEnabled ?? true;
不推荐的写法
// 如果你想要optionalThing是空值时返回false
optionalThing?.isEnabled == true;
// 如果你想要optionalThing是空值时返回true
optionalThing?.isEnabled != false;
PS:如果这里你有些不理解,可以先阅读一下作者之前的文章Flutter基础——Dart语法,学习一下’?’ ‘??’ ‘??=’ 的使用
两种操作都会产生同样的结果,而且做的都是正确的事情,但首选??操作符,主要有三个原因。
-
??运算符清楚地表明,代码与空值有关。
-
当左边的布尔表达式不会为空时,==true看起来像是多余的。
-
??false 和 ??true 清楚地表明了当表达式为null时将使用什么值。对于true,你必须清楚左边表达式的布尔逻辑,才会明白想要 左边表达式是null时返回false 为什么要用 true。
集合
Dart 集合中原生支持了四种类型:list, map, queue, 和 set。 下面是应用于集合的最佳实践。
尽可能的使用集合字面量。
两种方式来构造一个空的可变 list : []
和 List()
。 同样,有三种方式来构造一个空的Map map:{}
, Map()
, 和 LinkedHashMap()
。
如果想创建一个固定不变的 list 或者其他自定义集合类型,这种情况下你需要使用构造函数。 否则,使用字面量语法更加优雅。 核心库中暴露这些构造函数易于扩展,但是通常在 Dart 代码中并不使用构造函数。
推荐的写法
var points = [];
var addresses = {};
不推荐的写法
var points = List();
var addresses = Map();
如果需要的话,你可以提供一个泛型。
推荐的写法
var points = <Point>[];
var addresses = <String, Address>{};
不推荐的写法
var points = List<Point>();
var addresses = Map<String, Address>();
注意,对于集合类的 命名 构造函数则不适用上面的规则。 List.from()
、 Map.fromIterable()
都有其使用场景。 如果需要一个固定长度的结合,使用 List()
来创建一个固定长度的 list 也是合理的。
不要使用 .length
来判断一个集合是否为空。
通过调用 .length
来判断集合是否包含内容是非常低效的。相反,Dart 提供了更加高效率和易用的 gette