前面我们已经安装了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安装

1
2
3
4
5
brew tap dart-lang/dart
brew install dart

dart --version
Dart 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:

1
2
3
4
5
void main() {
  sayHello("Dart");
}

void sayHello(lang) => print('hello $lang');

运行:

1
dart hello.dart

3.2 内置类型

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void main() {
  var name = 'Voyager I';
  var year = 1977;
  var antennaDiameter = 3.7;
  var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
  var image = {
    'tags': ['saturn'],
    'url': '//path/to/saturn.jpg'
  };

  if (year >= 2001) {
    print('21st century');
  } else if (year >= 1901) {
    print('20th century');
  }

  for (var object in flybyObjects) {
    print(object);
  }

  for (int month = 1; month <= 12; month++) {
    print(month);
  }

  while (year < 2016) {
    year += 1;
  }
  print(antennaDiameter.round());
  print(name);
  print(image);
}

3.3 函数

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

void main() {
  var result = fibonacci(20);
  print(result);
}

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

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

void sayHello(String lang) => print('hello ' + lang);
sayHello("Dart");

3.4 类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Spacecraft {
  String name;
  DateTime launchDate;
  int lautchYear;

  // Constructor, including syntactic sugar for assignment to members.
  Spacecraft(this.name, this.launchDate) {
    lautchYear = launchDate?.year;
  }

  // Named constructor that forwards to the default one.
  Spacecraft.unlaunched(String name) : this(name, null);

  // Method
  void describe() => print('Spacecraft: $name, $lautchYear');

}

void main() {
  var voyager = new Spacecraft('Voyager I', new DateTime(1977, 9, 5));
  voyager.describe();
}

3.5 Inheritance 和 Mixins

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Orbiter extends Spacecraft {
  num altitude;
  Orbiter(String name, DateTime launchDate, this.altitude)
      : super(name, launchDate);
}

class Manned {
  int astronauts;
  void describeCrew() {
    print('Number of astronauts: $astronauts');
  }
}

class Orbiter extends Spacecraft with Manned {
  // ...
}

3.6 Interface

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

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

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

参考