Dart2
Flutter1.0已经发布,而作为Flutter的编写语言Dart2相比较Dart1也有了非常大的改进,在Flutter发布预览版的时候试着使用Flutter编写了一些demo,但是因为写惯了java,使用Dart2的时候还是有一些别扭。目前貌似还没有Dart2的书籍出版(有的话可以告诉我),所以准备根据 Dart2官方文档 从零开始学习。
Dart2重要概念
- 你可以放到一个变量中的所有内容都是对象,每一个对象都是一个类的实例。数字,函数以及 null 都是对象。所有的对象都继承自 Object 类。
- 尽管Dart是强类型的,但是类型注释是可选的,因为Dart可以推导出类型。如果要明确说明不需要任何类型,请使用特殊类型dynamic。
- Dart支持泛型类型,如List(整数列表),List(任何类型的对象列表).
- Dart支持顶级函数(例如main()),以及绑定到类或者对象的函数(分别是静态和实例方法)。你还可以在函数内创建函数(嵌套函数或本地函数)。
- 类似的Dart支持顶级变量以及绑定到类或者对象的变量(分别是静态或者实例变量)。实例变量有时也被称为字段或者属性。
- 不同于Java,Dart没有public,protected和private关键字。如果一个标识符以下划线(—)开始,那么它对其库是私有的。
- 标识符以字符或者下划线开头,后跟字符和数字的任意组合。
- Dart有两种表达式(具有运行时值)和语句(不具有运行时值)。例如:条件表达式condition ? expr1 : expr2 的值为expr1或expr2,将其与if-else语句相比较,该语句没有任何值。语句通常包含一个或者多个表达式,但是一个表达式不能直接包含一个语句。
- Dart工具可以报告两种问题:警告(warning)和错误(errors).警告(warning)仅仅暗示你的代码可能不会运行,但是它们不会阻止你的程序的运行。错误(Errors)可以使编译时或运行时的。一个编译时错误会阻止代码的运行;而一个运行时错误导致代码在执行时引发异常。
注释
- 单行注释,使用//开头
// TODO: refactor into an AbstractLlamaGreetingFactory?
- 多行注释
void main() {
/*
* This is a lot of work. Consider raising chickens.
Llama larry = Llama();
larry.feed();
larry.exercise();
larry.clean();
*/
}
- 文档注释
- 第一种方式以 /// 开头
/// Feeds your llama [Food].
///
/// The typical llama eats one bale of hay per week.
void feed(Food food) {
// ...
}
- 第二种方式以 /** 开头
/// Feeds your llama [Food].
///
/// The typical llama eats one bale of hay per week.
void feed(Food food) {
/**
}
注:在文档注释中可以使用括号[],()来链接到 类,方法,字段,全局变量,函数以及参数
变量
如下可以创建一个变量并且初始化它:
var name = 'Bob';
变量存储的是引用。一个名为 name 的变量包含对字符串对象的引用,其值为“Bob”。
name变量的类型被推断为字符串,但是你可以通过明确指定其类型来改变它的类型。如果一个对象不限于单一类型,可以指定为 Object或dynamic类型。
dynamic name = 'Bob';
另一种选择是显式声明可以推断出的类型:
String name = 'Bob';
默认值
未被初始化的变量有一个初始化的值 null.即使是数字类型的变量最初也为null,因为数字像Dart中其他任何类型一样都是对象。
int lineCount;
assert(lineCount == null);
Final 和 const
如果你从不打算更改变量,请使用final 或 const,而不是var或者类型。一个 final 变量仅仅可以被设置一次;一个 const 变量是一个编译时常量。const 变量是隐式 final 变量。final修饰的顶级变量或者类变量在第一次使用时被初始化。
例如:
final name = 'Bob'; // Without a type annotation
final String nickname = 'Bobby';
你不能改变一个final 变量的值:
name = 'Alice'; // Error: a final variable can only be set once.
对于一个要成为编译时常量的变量请使用 const 修饰。如果一个const变量是类级别的,将他标记为 static const。在定义变量的地方,将值设置为编译时常量,例如数字或字符串字面量,const变量或者对常数进行算术运算的结果。
const bar = 1000000; // Unit of pressure (dynes/cm2)
const double atm = 1.01325 * bar; // Standard atmosphere
const 关键字并不仅仅用来声明常量变量。你也可以使用它来创建常量值,以及声明创建常量值的构造函数。任何变量都可以具有常量值。
var foo = const [];
final bar = const [];
const baz = []; // Equivalent to `const []`
你可以从const声明的初始化表达式中省略const,例如上面的 baz 变量。
你可以改变一个非 final,const变量的值,即使它曾经有一个 const 值
foo = [1, 2, 3]; // Was const []
你不能改变一个 const 变量的值:
baz = [42]; // Error: Constant variables can't be assigned a value.