Dart
本文最后更新于261 天前,其中的信息可能已经过时,如有错误请发送邮件到zhizihua030611@163.com

变量

可以用  var  来定义变量,不用显式指定他们的类型,支持类型推断。

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',
};

关键字

基本结构关键字

关键字用途说明示例
import导入库import 'dart:math';
library声明库名library my_library;
export导出库成员export 'src/utils.dart';
part声明部分库文件part 'part1.dart';
part of声明属于某个库part of main_library;
typedef创建类型别名typedef IntList = List<int>;

变量与类型

关键字用途说明示例
var类型推断变量var name = 'Dart';
final运行时常量final pi = 3.14;
const编译时常量const maxSize = 100;
dynamic动态类型dynamic value = 5;
void无返回值类型void main() {...}
late延迟初始化late String description;
required必需命名参数Person({required this.name});

流程控制

关键字用途说明示例
if/else条件判断if (isRaining) {...} else {...}
for循环for (var i=0; i<5; i++)
while当循环while (!isDone) {...}
dodo-while 循环do {...} while (condition);
switch/case多分支选择switch (command) { case 'A': ... }
break跳出循环break;
continue跳过本次循环continue;
return函数返回值return result;
assert调试断言assert(text != null);

异常处理

关键字用途说明示例
try异常捕获try {...}
catch捕获异常catch (e) {...}
on特定类型异常on FormatException {...}
finally最终执行块finally {...}
throw抛出异常throw FormatException();
rethrow重新抛出异常rethrow;

面向对象编程

关键字用途说明示例
class定义类class Point {...}
extends类继承class Orbiter extends Spacecraft {...}
implements接口实现class MockSpaceship implements Spacecraft {...}
with混入(mixin)class Musician extends Person with Musical {...}
mixin定义混入mixin Musical {...}
abstract抽象类/方法abstract class Animal {...}
factory工厂构造函数factory Logger() {...}
super访问父类super.describe();
this当前实例this.name = name;
new创建对象(可选)var p = Point();
covariant协变参数类型void update(covariant View v) {...}

函数相关

关键字用途说明示例
Function函数类型Function callback;
async异步函数Future<void> main() async {...}
await等待异步结果var data = await fetch();
sync同步生成器Iterable<int> count() sync* {...}
yield生成值yield i;
yield*委派生成器yield* countDown();
getGetter 方法int get area => width * height;
setSetter 方法set radius(double r) {...}
operator操作符重载Vector operator +(Vector v) {...}
external外部函数声明external void log(String msg);

高级类型系统

关键字用途说明示例
enum枚举类型enum Color { red, green, blue }
extension扩展方法extension NumberParsing on String {...}
sealed密封类(Dart 3.0+)sealed class Shape {...}
base基类修饰(Dart 3.0+)base class Vehicle {...}
interface接口类修饰(Dart 3.0+)interface class DataStore {...}
mixin class混入类(Dart 3.0+)mixin class Animal {...}

布尔与空值

关键字用途说明示例
true布尔真值var isActive = true;
false布尔假值if (isValid == false) {...}
null空值String? name = null;

访问控制

关键字用途说明示例
show导入部分成员import 'lib.dart' show Foo;
hide隐藏部分成员import 'lib.dart' hide Bar;
deferred as延迟加载库import 'heavy.dart' deferred as heavy;

其他特殊关键字

关键字用途说明示例
is类型检查if (obj is String) {...}
as类型转换(obj as String).toUpperCase()
in集合包含for (var item in list) {...}
await for异步循环await for (var event in stream) {...}
@override方法重写注解@override void paint() {...}
@protected保护成员注解@protected void internalMethod()

流程控制语句

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

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

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

while (year < 2016) {
 year += 1;
}

同时还包括 breakcontinue 关键字、 switch 语句和 case 子句 以及 assert 语句。

函数

tips:为每个函数的参数以及返回值都指定类型:

int fibonacci(int n) {
 if (n == 0 || n == 1) return n;
 return fibonacci(n - 1) + fibonacci(n - 2);
}

var result = fibonacci(20);

匿名函数:

用 => 简写语法用于仅包含一条语句的函数。

flybyObjects.where((name) => name.contains('turn')).forEach(print);

导入(import)

// Importing core libraries
import 'dart:math';

// Importing libraries from external packages
import 'package:test/test.dart';

// Importing files
import 'path/to/my_other_file.dart';

类(class)

下面的示例中向你展示了一个包含三个属性、两个构造函数以及一个方法的类。其中一个属性不能直接赋值,因此它被定义为一个 getter 方法(而不是变量)。该方法使用字符串插值来打印字符串文字内变量的字符串。

class Spacecraft {
   String name;  // 航天器名称
   DateTime? launchDate;  // 发射日期(可为空)

   // 只读的非final属性(计算属性)
   // 当launchYear 为非空时返回年份,否则返回null
   int? get launchYear => launchDate?.year;

   // 构造函数,使用语法糖将参数直接赋值给成员变量
   Spacecraft(this.name, this.launchDate) {
       // 初始化代码写在这里
  }

   // 命名构造函数,转发到默认构造函数
   Spacecraft.unlaunched(String name) : this(name, null);

   // 方法:描述航天器信息
   void describe() {
       print('航天器名称: $name');
       // 类型提升对getter无效,需要先复制到局部变量
       var launchDate = this.launchDate;
       if (launchDate != null) {
           int years = DateTime.now().difference(launchDate).inDays ~/ 365;
           print('发射时间: $launchYear ($years 年前)');
      } else {
           print('未发射');
      }
  }
}

使用示例

void main() {
 // 已发射航天器
 final apollo = Spacecraft("阿波罗11号", DateTime(1969, 7, 16));
 apollo.describe();
 
 // 未发射航天器
 final probe = Spacecraft.unlaunched("火星探测器");
 probe.describe();
}

输出

航天器名称: 阿波罗11号
发射时间: 1969 (55 年前)
航天器名称: 火星探测器
未发射

枚举类型(Enum)

枚举类型的取值范围是一组预定义的值或实例。

简单定义了一组行星类别

enum PlanetType { terrestrial, gas, ice }

增强枚举类型

enum Planet {
mercury(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
venus(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
// ··· (其他行星的类似定义)
uranus(planetType: PlanetType.ice, moons: 27, hasRings: true),
neptune(planetType: PlanetType.ice, moons: 14, hasRings: true);

/// 常量生成构造函数
/// 常量构造:使用const构造函数确保编译时常量
const Planet({
required this.planetType,
required this.moons,
required this.hasRings,
});

/// 所有实例变量都是final(不可变的)
final PlanetType planetType;
final int moons;
final bool hasRings;

/// 增强型枚举支持getter和其他方法
/// 当行星类型是气态巨行星或者冰态巨行星时返回true
bool get isGiant =>
planetType == PlanetType.gas || planetType == PlanetType.ice;
}

使用示例

print(Planet.jupiter.isGiant); // 输出: true
print(Planet.earth.isGiant); // 输出: false

扩展类(继承)

Dart只支持单继承

class Orbiter extends Spacecraft {
double altitude;

Orbiter(super.name, DateTime super.launchDate, this.altitude);
}

当需要重写父类方法时,用到@override注解

class Orbiter extends Spacecraft {
double altitude;

Orbiter(super.name, DateTime super.launchDate, this.altitude);

// 使用 @override 重写父类方法
@override
void describe() {
super.describe(); // 可选:调用父类实现
print('轨道高度: $altitude 公里');
}

// 重写 getter
@override
int? get launchYear {
// 自定义逻辑
return super.launchYear;
}
}

接口和抽象类

所有的类都隐式定义成一个接口。因此,任意类都可以作为接口被实现。

class MockSpaceship implements Spacecraft {
// ···
}

你可以创建一个被任意具体类扩展(或实现)的抽象类。抽象类可以包含抽象方法(不含方法体的方法)。

abstract class Describable {
void describe();

void describeWithEmphasis() {
print('=========');
describe();
print('=========');
}
}

任意一个扩展了 Describable 的类都拥有 describeWithEmphasis() 方法,这个方法又会去调用实现类中实现的 describe() 方法。

异步

使用 asyncawait 关键字可以让你避免回调地狱 (Callback Hell) 并使你的代码更具可读性

const oneSecond = Duration(seconds: 1);
// ···
Future<void> printWithDelay(String message) async {
await Future.delayed(oneSecond);
print(message);
}
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇