第一次接触Dart时,我正寻找一种既能开发移动应用又能兼顾Web前端的语言。Dart以其清晰的语法结构和出色的性能表现吸引了我。作为Flutter框架的官方语言,Dart在现代跨平台开发中扮演着越来越重要的角色。
Dart最显著的特点是它的"万能性"——既可以编译为本地机器码获得接近C++的性能,也能编译为JavaScript运行在浏览器中。这种灵活性让它成为全栈开发的理想选择。我最初学习Dart是为了开发Flutter应用,但很快发现它在服务端开发、命令行工具等领域同样表现出色。
在macOS上安装Dart SDK最简单的方式是通过Homebrew:
bash复制brew tap dart-lang/dart
brew install dart
安装完成后,验证版本:
bash复制dart --version
注意:如果你计划主要开发Flutter应用,可以直接安装Flutter SDK,它已经包含了Dart,无需单独安装。
我尝试过多种Dart开发工具,以下是个人体验:
推荐初学者从VS Code开始,安装Dart和Flutter插件后即可获得:
Dart是强类型语言,但支持类型推断。声明变量有两种方式:
dart复制// 显式类型声明
String name = 'Dart';
// 类型推断
var version = 2.12;
Dart的基本数据类型包括:
int, doubleStringboolListMapSymbolNullDart中的函数是一等公民,可以作为参数传递或赋值给变量:
dart复制// 常规函数
int add(int a, int b) {
return a + b;
}
// 箭头函数(单行表达式)
int multiply(int a, int b) => a * b;
// 匿名函数
var sayHello = (String name) => 'Hello, $name!';
Dart的控制语句与其他C风格语言类似:
dart复制// if-else
if (score >= 60) {
print('Passed');
} else {
print('Failed');
}
// for循环
for (var i = 0; i < 5; i++) {
print(i);
}
// try-catch
try {
// 可能抛出异常的代码
} on Exception catch (e) {
// 特定异常处理
} catch (e) {
// 通用异常处理
} finally {
// 清理代码
}
Dart是完全面向对象的语言,即使基本类型也是对象:
dart复制class Person {
// 实例变量
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.guest() {
name = 'Guest';
age = 18;
}
// 方法
void introduce() {
print('Hi, I\'m $name, $age years old.');
}
}
// 使用类
var person = Person('Alice', 25);
person.introduce();
Dart支持单继承,但通过混入(Mixin)实现多重继承的效果:
dart复制class Animal {
void eat() => print('Eating...');
}
// Mixin
class Flyable {
void fly() => print('Flying...');
}
class Bird extends Animal with Flyable {
void chirp() => print('Chirping...');
}
var bird = Bird();
bird.eat(); // 继承自Animal
bird.fly(); // 来自Flyable mixin
bird.chirp(); // 自身方法
Dart使用Future处理异步操作,配合async/await语法让异步代码看起来像同步代码:
dart复制Future<String> fetchUserData() async {
// 模拟网络请求
await Future.delayed(Duration(seconds: 2));
return '{"name": "John", "age": 30}';
}
void main() async {
print('Fetching data...');
var data = await fetchUserData();
print('Data received: $data');
}
对于连续的数据流,Dart提供了Stream:
dart复制Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
void main() async {
await for (final number in countStream(5)) {
print(number);
}
}
创建一个简单的命令行计算器:
dart复制import 'dart:io';
void main() {
print('Enter first number:');
var num1 = double.parse(stdin.readLineSync()!);
print('Enter second number:');
var num2 = double.parse(stdin.readLineSync()!);
print('Select operation (+, -, *, /):');
var op = stdin.readLineSync()!;
double result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
print('Invalid operator');
return;
}
print('Result: $result');
}
空安全错误:Dart 2.12+默认启用空安全
?,或使用!断言非空类型转换错误
dart复制var input = '123';
var number = int.parse(input); // 正确
var invalid = int.tryParse('abc'); // 返回null而不是抛出异常
包依赖问题
dart pub get或flutter pub get来获取依赖pubspec.yaml中的依赖版本异步代码未执行
asyncawait关键字基础语法(1-2周)
面向对象(1周)
高级特性(2-3周)
生态工具(持续学习)
我在实际学习中发现,Dart最强大的地方在于它的"一致性"——无论是开发小型脚本还是大型应用,语言特性都能保持统一。初学者常犯的错误是过早关注Flutter框架,建议先打好Dart基础,这样学习Flutter时会事半功倍。