-
Final && const
final 只能被赋值一次,const是编译时常量,如果使用 const 修饰类中的变量,则必须加上 static 关键字,即 static const const 关键字不仅仅可以用来定义常量,还可以用来创建 常量值,该常量值可以赋予给任何变量。你也可以将构造函数声明为 const 的,这种类型的构造函数创建的对象是不可改变的。
var foo = const []; final bar = const []; const baz = []; // Equivalent to `const []`
没有使用 final 或 const 修饰的变量的值是可以被更改的,即使这些变量之前引用过 const 的值。
foo = [1, 2, 3]; var constantList = const [1, 2, 3]; // constantList[1] = 1; // This line will cause an error.
-
Dart 字符串(String 对象)包含了 UTF-16 编码的字符序列
-
使用三个单引号或者三个双引号也能创建多行字符串:
var s1 = ''' You can create multi-line strings like this one. ''';
-
raw string:
var s = r'In a raw string, not even \n gets special treatment.';
-
扩展操作符(...)和 空感知扩展操作符(...?):
var list = [1, 2, 3]; var list2 = [0, ...list];
如果list可能为空则采用: var list2 = [0, ...?list]; -
集合中的 if
和集合中的 for
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet']; var listOfInts = [1, 2, 3]; var listOfStrings = ['0', for (var i in listOfInts) 'demo:$i'];
-
set:
因为先有的 Map 字面量语法,所以 {} 默认是 Map 类型。如果忘记在 {} 上注释类型或赋值到一个未声明类型的变量上,那么 Dart 会创建一个类型为 Map<dynamic, dynamic> 的对象。
-
Map:
键和值都可以是任何类型的对象
-
参数
- 必要 可以使用 required 来标识一个命名参数是必须的参数:
const Scrollbar({Key? key, required Widget child})
- 可选
1. 命名,命名参数默认为可选参数,除非他们被特别标记为 required。使用 {参数1, 参数2, …} 来指定命名参数:
dart void enableFlags({bool? bold, bool? hidden}) {...}
2. 位置,可选的位置参数dart String say(String from, String msg, [String? device])
-
默认参数值
void enableFlags({bool bold = false, bool hidden = false}) String say(String from, String msg, [String device = 'carrier pigeon'])
-
条件表达式
条件 ? 表达式 1 : 表达式 2
var visibility = isPublic ? 'public' : 'private';
表达式 1 ?? 表达式 2
如果表达式 1 为非 null 则返回其值,否则执行表达式 2 并返回其值。
String playerName(String? name) => name ?? 'Guest';
-
级联运算符,(..,?..) 可以让你在同一个对象上连续调用多个对象的变量或方法。返回值为 void 的方法则不能使用级联运算符。
var paint = Paint() ..color = Colors.black ..strokeCap = StrokeCap.round ..strokeWidth = 5.0; 替换: var paint = Paint(); paint.color = Colors.black; paint.strokeCap = StrokeCap.round; paint.strokeWidth = 5.0;
-
switch case 每一个非空的 case 子句都必须有一个 break 语句,也可以通过 continue、throw 或者 return 来结束非空 case 语句。 Dart 支持空的 case 语句,允许其以 fall-through 的形式执行。
var command = 'CLOSED'; switch (command) { case 'CLOSED': // Empty case falls through. case 'NOW_CLOSED': // Runs for both CLOSED and NOW_CLOSED. executeNowClosed(); break; } //在非空 case 语句中想要实现 fall-through 的形式,可以使用 continue 语句配合 label 的方式实现: var command = 'CLOSED'; switch (command) { case 'CLOSED': executeClosed(); continue nowClosed; // Continues executing at the nowClosed label. nowClosed: case 'NOW_CLOSED': // Runs for both CLOSED and NOW_CLOSED. executeNowClosed(); break; }
-
断言 assert(条件, 可选信息); 如果表达式的值为 false,则断言失败,抛出一个 AssertionError 异常。 如何判断 assert 是否生效?assert 是否生效依赖开发工具和使用的框架:
Flutter 在调试模式时生效。
一些开发工具比如
dartdevc
通常情况下是默认生效的。其他一些工具,比如
dart run
以及dart2js
通过在运行 Dart 程序时添加命令行参数--enable-asserts
使 assert 生效。在生产环境代码中,断言会被忽略,与此同时传入 assert 的参数不被判断。
-
异常 Dart 中可以将任何非 null 对象作为异常抛出而不局限于 Exception 或 Error 类型。
捕获异常
try { breedMoreLlamas(); } on OutOfLlamasException { buyMoreLlamas(); } // 可以使用 on 或 catch 来捕获异常,使用 on 来指定异常类型,使用 catch 来捕获异常对象,两者可同时使用。 try { breedMoreLlamas(); } on OutOfLlamasException { // A specific exception buyMoreLlamas(); } on Exception catch (e) { // Anything else that is an exception print('Unknown exception: $e'); } catch (e) { // No specified type, handles all print('Something really unknown: $e'); } // 可以为 catch 方法指定两个参数,第一个参数为抛出的异常对象,第二个参数为栈信息 StackTrace 对象: try { // ··· } on Exception catch (e) { print('Exception details:\n $e'); } catch (e, s) { print('Exception details:\n $e'); print('Stack trace:\n $s'); } // rethrow 可以将捕获的异常再次抛出 void misbehave() { try { dynamic foo = true; print(foo++); // Runtime error } catch (e) { print('misbehave() partially handled ${e.runtimeType}.'); rethrow; // Allow callers to see the exception. } } void main() { try { misbehave(); } catch (e) { print('main() finished handling ${e.runtimeType}.'); } } // 无论是否抛出异常,finally 语句始终执行,如果没有指定 catch 语句来捕获异常,则异常会在执行完 finally 语句后抛出: try { breedMoreLlamas(); } finally { // Always clean up, even if an exception is thrown. cleanLlamaStalls(); } try { breedMoreLlamas(); } catch (e) { print('Error: $e'); // Handle the exception first. } finally { cleanLlamaStalls(); // Then clean up. }
-
class
两个使用相同构造函数相同参数值构造的编译时常量是同一个对象:
var a = const ImmutablePoint(1, 1); var b = const ImmutablePoint(1, 1); assert(identical(a, b)); // They are the same instance!
实例变量:
class Point { double? x; // Declare instance variable x, initially null. double? y; // Declare y, initially null. double z = 0; // Declare z, initially 0. } // 所有未初始化的实例变量其值均为 null。 // 构造函数不被继承,子类不会继承父类的构造函数,如果子类没有声明构造函数,那么只会有一个默认无参数的构造函数。