dart编程语言快速入门 (通过10个例子快速了解基本语法)

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();
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容