前面我们已经安装了Flutter的开发环境,并运行了Flutter的hello_world的样例。本篇介绍一下Dart语言开发环境的安装和配置。 Dart也是谷歌开发的一门用于前端开发的语言(当然也支持服务器端),据说最初的目的是想取代JavaScript,后来Flutter的开发语言成了Dart。 因此,学习Flutter的第一步是先学一下Dart语言开发。(ps: 前端开发的Dart + 后端开发的Go,不难看出Google的布局)。

如果在学习Dart之前如果已经熟悉Java、Go、Groovy等编程语言的话,对于快速学习Dart的语法和一些基本特性,只需要花一个小时的时间阅读以下Dart官方的 Dart语法预览文档即可,感觉Dart在语法上融合了众语言的特性,提供了很多语法糖,因此可能会觉得有点’杂’。

1.Dart SDK安装

1brew tap dart-lang/dart
2brew install dart
3
4dart --version
5Dart VM version: 2.4.0 (Wed Jun 19 11:53:45 2019 +0200) on "macos_x64"

2.VS Code安装Dart Code插件

在VS Code中安装Dart Code插件

3.Dart语言快速浏览

3.1 Hello Dart

hello.dart:

1void main() {
2  sayHello("Dart");
3}
4
5void sayHello(lang) => print('hello $lang');

运行:

1dart hello.dart

3.2 内置类型

Dart内置了几种常用类型,分别是String, int, double, bool, List, Map,看下面的代码例子:

 1
 2void main() {
 3  var name = 'Voyager I';
 4  var year = 1977;
 5  var antennaDiameter = 3.7;
 6  var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
 7  var image = {
 8    'tags': ['saturn'],
 9    'url': '//path/to/saturn.jpg'
10  };
11
12  if (year >= 2001) {
13    print('21st century');
14  } else if (year >= 1901) {
15    print('20th century');
16  }
17
18  for (var object in flybyObjects) {
19    print(object);
20  }
21
22  for (int month = 1; month <= 12; month++) {
23    print(month);
24  }
25
26  while (year < 2016) {
27    year += 1;
28  }
29  print(antennaDiameter.round());
30  print(name);
31  print(image);
32}

3.3 函数

 1int fibonacci(int n) {
 2  if (n == 0 || n == 1) {
 3    return n;
 4  }
 5  return fibonacci(n - 1) + fibonacci(n - 2);
 6}
 7
 8void main() {
 9  var result = fibonacci(20);
10  print(result);
11}

只有一个语句的方法可以写成类似箭头函数风格:

1var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
2flybyObjects.where((name) => name.contains("anus")).forEach(print);
3
4void sayHello(String lang) => print('hello ' + lang);
5sayHello("Dart");

3.4 类

 1
 2class Spacecraft {
 3  String name;
 4  DateTime launchDate;
 5  int lautchYear;
 6
 7  // Constructor, including syntactic sugar for assignment to members.
 8  Spacecraft(this.name, this.launchDate) {
 9    lautchYear = launchDate?.year;
10  }
11
12  // Named constructor that forwards to the default one.
13  Spacecraft.unlaunched(String name) : this(name, null);
14
15  // Method
16  void describe() => print('Spacecraft: $name, $lautchYear');
17
18}
19
20void main() {
21  var voyager = new Spacecraft('Voyager I', new DateTime(1977, 9, 5));
22  voyager.describe();
23}

3.5 Inheritance 和 Mixins

 1class Orbiter extends Spacecraft {
 2  num altitude;
 3  Orbiter(String name, DateTime launchDate, this.altitude)
 4      : super(name, launchDate);
 5}
 6
 7class Manned {
 8  int astronauts;
 9  void describeCrew() {
10    print('Number of astronauts: $astronauts');
11  }
12}
13
14class Orbiter extends Spacecraft with Manned {
15  // ...
16}

3.6 Interface

Dart 没有 interface 关键字。在 Dart 中所有的类都隐含的定义了一个接口。因此你可以使用 implement 来实现任意的类隐含定义的接口。

1class MockSpaceship implements Spacecraft {
2  // ...
3}

更多可查看Dart文档中的示例代码

参考