dart编程语言快速入门 (通过10个例子快速了解基本语法)
dart是一门面向对象的,单继承的单线程编程语言.
它是专门设计用于客户端制作的编程语言.dart可以编译为JavaScript.
本文基于官网给出的例子 https://dart.dev/samples
01.hello world
// 001.hello wrold.dart
// 定义一个函数
printInteger(int aNumber) {
print('The number is $aNumber.'); // 打印到控制台。
}
// 每个dart app 需要有一个main函数
void main() {
var number = 42; // 声明并初始化一个变量。
printInteger(number); // 调用函数。
}
// 在powershell中执行 dart '.\001.hello wrold.dart' 查看控制台输出
/*
注释的方法有两种
*/
02.变量
// 002.variables.dart
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'
};
main() {
print(name);
print(year);
print(antennaDiameter);
print(flybyObjects);
print(image);
}
03.流程控制
// 003.Control flow statements.dart
import '002.variables.dart';
main() {
if (year >= 2001) {
print('21st century');
} else if (year >= 1901) {
print('20th century');
}
// 流程控制比较像JavaScript,几乎一模一样,不同的地方是有int之类的类型系统
for (var object in flybyObjects) {
print(object);
}
for (int month = 1; month <= 12; month++) {
print(month);
}
while (year < 2016) {
year += 1;
}
print(year);
}
04.斐波那契数列
// 004.fibonacci.dart
// 这里要借用2里定义的变量,所以导入一下
import '002.variables.dart';
// 建议明确函数的返回值类型
int fibonacci(int n) {
if (n == 0 || n == 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
var result = fibonacci(20);
main(List<String> args) {
print(result);
// 下面展示了箭头函数,就和JavaScript es6的语法一样的
// where函数就类似于powershell里面的where-object,也类似于javascript里的filter函数
// forEach类似于powershell里面的foreach-object,也类似于JavaScript里的map
flybyObjects.where((name) => name.contains('turn')).forEach(print);
}
05.import
// 006.imports.dart
// 要访问其他dart文件或库里的api,可以用import
// 导入后直接作为全局变量被引入
// 1.从标准库引入
import 'dart:math';
// 2.从外部库引入
// import 'package:test/test.dart';
// 3.从文件引入
import '004.fibonacci.dart';
// 4.引入后起一个别名,不污染全局变量
import '002.variables.dart' as v;
// 文件引入部分有点像julia了.一引入文件直接变全局变量了.
main() {
print(Random().nextInt(100));
print(fibonacci(3));
print(v.flybyObjects);
}
06.类和继承
// 007.class.dart
class Spacecraft {
String name;
DateTime? launchDate;
int? get launchYear => launchDate?.year; // read-only non-final property
//构造函数,有自动对参数赋值的语法糖
Spacecraft(this.name, this.launchDate) {
// Initialization code goes here.
}
// 基于默认构造函数的命名构造函数,这边是省略了运行时间的构造函数
Spacecraft.unlaunched(String name) : this(name, null);
// 方法
void describe() {
print('Spacecraft: $name');
var launchDate = this.launchDate; // Type promotion doesn't work on getters.
if (launchDate != null) {
int years = DateTime.now().difference(launchDate).inDays ~/ 365;
print('Launched: $launchYear ($years years ago)');
} else {
print('Unlaunched');
}
}
}
// 继承语法
class Orbiter extends Spacecraft {
double altitude;
Orbiter(String name, DateTime launchDate, this.altitude)
: super(name, launchDate);
}
// 整体上这个类和typescript的有像的地方,比如?表示属性可有可无,而且它的默认值都是null.
// 但是多了更多语法糖
main(List<String> args) {
var newCraft = new Spacecraft('神舟6号', DateTime(2006));
newCraft.describe();
var newCraft2 = Spacecraft.unlaunched('神舟13号');
newCraft2.describe();
var skyHouse = new Orbiter('天宫1号', DateTime(2020), 8000);
print('下面是继承测试============');
skyHouse.describe();
}
07.mixins
// 008.mixins.dart
import '007.class.dart';
// mixin 是一种在多个类层次上重用代码的方式
mixin Piloted {
int astronauts = 1;
void describeCrew() {
print('Number of astronauts: $astronauts');
}
}
// 要将mixin扩展到一个类,只需要extend with语法,
class PilotedCraft extends Spacecraft with Piloted {
PilotedCraft(String name, DateTime? launchDate) : super(name, launchDate);
// ···
}
main(List<String> args) {
var p1 = new PilotedCraft('f98', DateTime(2100));
p1.describeCrew();
}
08.接口和抽象类
// 009.interface abstrac classes.dart
import '007.class.dart';
// dart没有interface关键字,但是所有类都隐式定义了一个接口,所以你可以直接implement任意一个类
// 这种语法就很像java了
class MockSpaceship implements Spacecraft {
@override
DateTime? launchDate;
@override
late String name;
@override
void describe() {
// TODO: implement describe
}
@override
// TODO: implement launchYear
int? get launchYear => throw UnimplementedError();
}
// 创建一个抽象类,可以被其他类继承,抽象类可以包含抽象方法(空的方法体)
abstract class Describable {
void describe();
void describeWithEmphasis() {
print('=========');
describe();
print('=========');
}
}
09.async await异步
// 010.async.dart
import 'dart:io';
import '007.class.dart';
const oneSecond = Duration(seconds: 1);
// async语法和JavaScript的区别还是有点明显,不想js直接把async写在function前面
Future<void> printWithDelay(String message) async {
await Future.delayed(oneSecond);
print(message);
}
// 上面的写法等价于
Future<void> printWithDelay2(String message) {
return Future.delayed(oneSecond).then((_) {
print(message);
});
}
Future<void> createDescriptions(Iterable<String> objects) async {
for (var object in objects) {
try {
var file = File('$object.txt');
if (await file.exists()) {
var modified = await file.lastModified();
print('File for $object already exists. It was modified on $modified.');
continue;
}
await file.create();
await file.writeAsString('Start describing $object in this file.');
} on IOException catch (e) {
print('Cannot create description for $object: $e');
}
}
}
// async* 用于创建可读流
Stream<String> report(Spacecraft craft, Iterable<String> objects) async* {
for (var object in objects) {
await Future.delayed(oneSecond);
yield '${craft.name} flies by $object';
}
}
// 总体来说async语法,还是比较接近js那一套。
main(List<String> args) {
createDescriptions(['hello', 'world']);
}
010.异常处理
// 011.Execptions.dart
import 'dart:io';
import '002.variables.dart';
var astronaut = 0;
main(List<String> args) async {
// 使用throw抛出异常
// if (astronaut == 0) {
// throw StateError('No astronauts');
// }
// 使用try on catch 关键词,来捕获异常
try {
for (var object in flybyObjects) {
var description = await File('$object.txt').readAsString();
print(description);
}
} on IOException catch (e) {
print('Could not describe object: $e');
} finally {
flybyObjects.clear();
}
}