ZetCode

Dart 基础

最后修改日期:2024 年 1 月 28 日

在本文中,我们将介绍 Dart 语言的基本编程概念。

Dart 是一种面向客户端的语言,可用于在任何平台上快速构建应用程序。它用于构建移动、桌面、服务器和 Web 应用程序。

Dart 简单示例

下面是一个简单的 Dart 示例。

main.dart
void main() {
  print('First program in Dart');
}

该程序将一条消息打印到控制台。Dart 程序具有 main.dart 扩展名。main 函数是程序的入口点。函数的正文包含在一对花括号中。print 函数在控制台显示一条消息。语句以分号结尾。

$ dart main.dart
First program in Dart

我们运行该程序。

Dart 注释

注释用于人类来澄清源代码。Dart 中有三种类型的注释:单行注释 (//)、多行注释 (/* */) 和文档注释 (///)。

文档注释由 dartdoc 用于生成文档。IDE 也使用它们。

main.dart
/*
  This is main.dart
  Author: Jan Bodnar
  ZetCode 2023
*/

// Program starts here
void main() {
  print("This is a Dart program");
}

在示例中,我们有一个多行注释和一个单行注释。编译器会忽略注释。

Dart 变量

变量存储对值的引用。每个值都是一个对象——一个类的实例。

main.dart
void main() {
  String name = 'John Doe';
  int age = 34;
  double height = 172.5;

  print('$name is $age years old; his height is $height cm');
}

在示例中,我们有三个变量:一个字符串、一个整数和一个双精度浮点数变量。变量的数据类型使用 Stringintdouble 显式指定。

String name = 'John Doe';

我们可以使用单引号和双引号创建字符串字面量。

print('$name is $age years old; his height is $height cm');

Dart 支持字符串中的变量插值。以 $ 字符开头的变量在字符串中将被求值为它们的值。

$ dart main.dart
John Doe is 34 years old; his height is 172.5

Dart var 关键字

当我们使用 var 关键字时,编译器会从赋值的右侧推断变量的数据类型。

main.dart
void main() {
  var name = 'John Doe';
  var age = 34;
  var height = 172.5;

  print('$name is $age years old; his height is $height cm');

  print(name.runtimeType);
  print(age.runtimeType);
  print(height.runtimeType);
}

这三个变量的数据类型由编译器推断。

print(name.runtimeType);
print(age.runtimeType);
print(height.runtimeType);

我们可以使用 runtimeType 属性来获取变量的数据类型。

$ dart main.dart
John Doe is 34 years old; his height is 172.5 cm
String
int
double

Dart dynamic 关键字

使用 dynamic 关键字,我们可以声明一个动态类型的变量。我们可以将不同数据类型的值赋给同一个变量。

main.dart
void main() {
  dynamic n = 3;
  print(3);

  n = 'three';
  print(n);
}

在示例中,我们首先将值 3 赋给 n 变量;之后,我们将字符串值“three”赋给它。

$ dart main.dart
3
three

Dart 用户输入

dart:io 库为非 Web 应用程序提供了文件、套接字、HTTP 和其他 I/O 支持。

main.dart
import 'dart:io';

void main() {
  stdout.write("Enter your name: ");
  var name = stdin.readLineSync();
  print('Hello $name\n');
}

该示例提示用户输入姓名并打印一条消息。

stdout.write("Enter your name: ");

我们可以使用 stdout.write 函数将内容写入控制台而不换行。

var name = stdin.readLineSync();

我们使用 stdin.readLineSync 读取用户输入。

$ dart main.dart
Enter your name: Peter
Hello Peter

Dart 条件语句

条件语句使用 ifelse ifelse 关键字创建。

main.dart
import 'dart:io';

void main() {
  stdout.write("Enter a number: ");
  var input = stdin.readLineSync();

  var n = int.parse(input);

  if (n > 0) {
    print('$n is a positive value');
  } else if (n == 0) {
    print('$n is zero');
  } else {
    print('$n is a negative value');
  }
}

在示例中,我们要求用户输入一个数字。根据接收到的值,我们将一条消息打印到控制台。

var n = int.parse(input);

由于 readLineSync 返回一个字符串,我们使用 int.parse 将字符串转换为数字。

if (n > 0) {
  print('$n is a positive value');
} else if (n == 0) {
  print('$n is zero');
} else {
  print('$n is a negative value');
}

if 关键字之后,我们将条件放在两个圆括号之间。如果条件为真,则执行 if 语句的正文。其他分支将被跳过。如果条件为假,编译器将测试 else if 语句之后的条件。如果为真,则执行随后的正文。如果两个条件都失败,则执行 else 语句之后的正文。

$ dart main.dart
Enter a number: 4
4 is a positive value
$ dart main.dart
Enter a number: -4
-4 is a negative value
$ dart main.dart
Enter a number: 0
0 is zero

Dart 异常

异常是指示发生了意外情况的错误。异常使用 tryoncatch 关键字进行处理。

main.dart
import 'dart:io';

void main() {
  stdout.write("Enter a number: ");
  var input = stdin.readLineSync();

  int n;

  try {
    n = int.parse(input);
  } on FormatException {
    print('wrong value');
    return 1;
  }

  if (n > 0) {
    print('$n is a positive value');
  } else if (n == 0) {
    print('$n is zero');
  } else {
    print('$n is a negative value');
  }
}

在示例中,我们处理用户未输入有效数字值的情况。

try {
  n = int.parse(input);
} on FormatException {
  print('wrong value');
return 1;
}

易出错的代码放在 try 语句的正文中。当字符串或其他数据格式不正确且无法解析或处理时,会引发 FormatException

$ dart main.dart
Enter a number: 4
4 is a positive value
$ dart main.dart
Enter a number: f
wrong value

Dart while 循环

while 语句是一种控制流语句,它允许根据给定的布尔条件重复执行代码。while 关键字执行由花括号括起来的代码块内的语句。每次表达式求值为 true 时都会执行这些语句。

main.dart
void main() {
  int i = 0;
  int sum = 0;

  while (i <= 10) {
    sum += i;
    i++;
  }

  print(sum);
}
在代码示例中,我们计算某个数字范围内值的总和。

while 循环有三个部分。初始化、测试和更新。语句的每次执行都称为一个周期。

int i = 0;

我们初始化 i 变量。它用作计数器。

while (i <= 10) {
   ...
}

while 关键字后面的圆括号内的表达式是第二阶段,即测试。主体中的语句将一直执行,直到表达式的计算结果为假。

sum += i;

我们将 i 的当前值加到 sum 变量中。

i++;

这是 while 循环的最后、第三个阶段,即更新。我们递增计数器。请注意,对 while 循环的处理不当可能导致无限循环。

$ dart main.dart
55

Dart for 循环

我们可以使用 for 语句进行循环。Dart 中有两种 for 循环:经典的 for 循环和 for-in 循环。

main.dart
void main() {
  var sum = 0;
  for (var i = 0; i < 10; i++) {
    sum += i;
  }

  print(sum);

  var vals = [1, 2, 3, 4, 5];
  for (var e in vals) {
    print(e * e);
  }
}

在示例中,我们同时使用了这两种 for 循环。

var sum = 0;
for (var i = 0; i < 10; i++) {
     sum += i;
}

我们使用经典的 for 循环计算 1..10 的值之和。有三个阶段。在第一个阶段,我们将计数器 i 初始化为零。此阶段仅执行一次。接下来是条件。如果满足条件,则执行 for 块内的语句。在第三个阶段,计数器增加。然后我们重复第 2、3 个阶段,直到条件不再满足,然后退出 for 循环。在我们的例子中,当计数器 i 等于 10 时,for 循环停止执行。

var vals = [1, 2, 3, 4, 5];
for (var e in vals) {
     print(e * e);
}

在第二种形式中,我们逐个遍历列表的元素。我们对列表的所有值进行平方。

$ dart main.dart
45
1
4
9
16
25

Dart 命令行参数

Dart 程序可以接收命令行参数。当我们在运行时,它们会跟在程序名称后面。

main.dart
void main(List<String> args) {
  for (var val in args) {
    print(val);
  }

  print('---------');

  for (int i = 0; i < args.length; i++) {
    print(args[i]);
  }
}

我们在 args 列表中接收参数。我们使用经典的 for 循环和 for-in 循环遍历这些参数。

$ dart main.dart 1 2 3 4
1
2
3
4
---------
1
2
3
4

来源

Dart 指南

以上是对 Dart 编程语言的介绍。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程