Dart —— Google推出的编程语言,专为跨平台框架Flutter而设计。它结合了JIT编译以实现闪电般的热重载,以及AOT编译以实现发布版本的原生性能。Dart不仅用于移动开发,还用于Web应用程序(AngularDart)和服务器解决方案。更多关于该语言功能的信息,请阅读Dart官方文档。
要点
Dart —— 一种具有类C语法的编程语言,由Google在Lars Bak(Eclipse的创建者)的领导下开发。首次发布是在2011年,但Dart真正的流行是在2018年随着Flutter 1.0的发布而来的。该语言专为创建用户界面而设计:它内置了对流、Future和响应式模式的支持。
Dart的理念——"性能与生产力的平衡"。该语言支持两种编译策略:JIT(即时编译)用于带热重载的开发,以及AOT(提前编译)用于具有原生性能的发布版本。JIT编译器在毫秒内将修改后的代码注入正在运行的应用程序,无需重新编译APK——这是在移动开发背景下Dart相对于其他语言的关键优势。
Dart的关键特性——sound null safety,在Dart 2.12(2021)中引入。类型系统保证变量在没有显式指示(int?)的情况下不能为null。这消除了编译阶段的NullPointerException。根据Google的数据,null safety的实施使Flutter应用程序在生产环境中的崩溃数量减少了30%。
Dart生态系统包括三个主要方向:Flutter(移动和桌面应用程序)、AngularDart(Web应用程序)和Dart Server(服务器解决方案)。Flutter——占主导地位的平台:根据Statista(2025)的数据,Flutter用于46%的跨平台移动项目,领先于React Native(38%)和Xamarin(8%)。
Dart语法类似于Java和JavaScript,但有自己的独特结构。Dart中一切都是对象——甚至int、double和bool都继承自Object。类型化是可选的:声明为var的变量会自动推断类型,但为了可读性和性能,建议显式指定类型。
Dart支持int、double、String、bool、List、Set、Map、Record、Symbol和Runes。Nullable类型——任何带有后缀?的类型(int?、String?)。??运算符(null-aware)在左侧为null时返回右侧的值。级联表示法(..)允许在同一对象上调用多个方法而无需重复引用。
// Dart中的基本类型和声明
void main() {
// 显式类型化
int age = 25;
double price = 19.99;
String name = 'Dart';
bool isValid = true;
// Null safety —— 变量可以为null
int? nullableAge = null;
int result = nullableAge ?? 0; // Null-aware运算符
// 带泛型的集合
List<String> items = ['Dart', 'Flutter', 'Mobile'];
Map<String, dynamic> config = {
'version': '3.0',
'mode': 'debug',
};
// 级联表示法
final list = <String>[]
..add('one')
..add('two')
..sort();
}
// Record —— 匿名不可变类型
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'dynamic类型关闭类型检查——仅在处理JSON或动态数据时使用。Record——Dart 3.0中的新类型,允许在不创建单独类的情况下对值进行分组。Null-aware运算符??——处理nullable值的标准方式,替代冗长的if-else检查。
Dart中的类——单一继承(extends),通过mixin实现多重继承(mixin)。Dart不支持接口作为独立概念——任何类都可以被实现(implements)。Mixin——没有构造函数的类,其方法和字段可以通过with关键字添加到任何类中。
// Dart中的类、继承和mixin
abstract class Animal {
void sound(); // 抽象方法
}
mixin Swimmer {
void swim() => print('Swimming...');
}
mixin Flyer {
void fly() => print('Flying...');
}
class Duck extends Animal with Swimmer, Flyer {
@override
void sound() => print('Quack!');
}
void main() {
final duck = Duck();
duck.sound(); // Quack!
duck.swim(); // Swimming...
duck.fly(); // Flying...
}
// 命名构造函数
class Config {
final String env;
Config.development() : env = 'dev';
Config.production() : env = 'prod';
}Duck类继承自Animal并使用两个mixin——Swimmer和Flyer。这展示了多重继承而没有菱形结构问题:mixin被线性解析(super chain)。命名构造函数(Config.development)——用于创建具有预设参数的对象的静态工厂方法的替代方案。
Dart中的异步通过Future(单一值)、Stream(值序列)和async/await实现。Dart使用单线程事件循环模型,类似于JavaScript,但有一个重要区别:长时间计算不会阻塞UI,因为Dart代码在Isolate中执行——没有共享内存的独立线程。
Future表示一个在一段时间后完成的异步操作。Future可以处于pending(等待)、completed with value(成功)或completed with error(错误)状态。.then().catchError()链——async/await的替代方案,但为了可读性建议使用await。
// 使用Future和Stream异步加载数据
import 'dart:convert';
import 'package:http/http.dart' as http;
class ApiService {
final String baseUrl;
ApiService(this.baseUrl);
// 用于单个请求的Future
Future<Map<String, dynamic>> fetchUser(int id) async {
final response = await http.get(
Uri.parse('$baseUrl/users/$id'),
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to load user: ${response.statusCode}');
}
}
// 用于数据序列的Stream
Stream<int> countStream(int max) async* {
for (var i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
void main() async {
final api = ApiService('https://api.example.com');
// 使用await
final user = await api.fetchUser(1);
print('User: ${user['name']}');
// 使用await for处理Stream
await for (final count in api.countStream(5)) {
print('Count: $count');
}
}ApiService类演示了两种异步类型:用于HTTP请求的Future(一个响应)和用于顺序计数器的Stream(使用async*和yield的生成器)。Stream适用于传感器、地理定位、Firebase Realtime Database——任何数据持续到达的地方。Isolate使用独立内存——数据通过SendPort/ReceivePort传输。
Dart和Flutter形成一个统一的栈:Flutter——UI框架,Dart——描述UI的语言。在Flutter中,一切都是小部件(Widget)——从按钮到整个应用程序。小部件可以是stateful(具有可变状态)和stateless(不可变)。Dart描述声明式UI:build()返回一个小部件树,Flutter使用Skia(或在iOS上使用Impeller)进行渲染。
Flutter应用程序由main() → runApp(MyApp()) → MaterialApp组成。MaterialApp包括路由(routes)、主题(theme)和本地化。每个屏幕都是一个Scaffold,包含AppBar、Body(通常为Column/ListView)和BottomNavigationBar。通过Navigator.push/pop或命名路由进行导航。
// Dart中的简单Flutter应用程序
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dart Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Dart + Flutter')),
body: Center(
child: Text('Counter: $_counter'),
),
floatingActionButton: FloatingActionButton(
onPressed: _increment,
child: Icon(Icons.add),
),
);
}
}HomeScreen小部件——具有内部状态_counter的StatefulWidget。调用setState()通知Flutter需要重建UI——Dart代码重新启动build(),创建新的小部件树。Flutter高效比较(diff)新旧树,仅更新屏幕发生变化的部分。热重载替换build()而不重置_counter状态。
Dart编译——混合型:JIT用于开发,AOT用于生产。在调试模式下,Dart VM运行JIT编译器,该编译器解释字节码并支持热代码替换。在发布版本中,dart compile exe或flutter build为特定架构(arm64、x86_64、armv7)创建原生AOT二进制文件。
| 模式 | 编译 | 执行速度 | 二进制大小 | 热重载 |
|---|---|---|---|---|
| Debug | JIT (VM) | 中等 | ~50 MB | 是 |
| Release | AOT (Native) | 最大 | ~15-20 MB | 否 |
| Web | dart2js | 取决于浏览器 | 可变 | 开发服务器 |
Dart在调试模式下的JIT编译提供约1秒的热重载——开发者无需丢失应用程序状态即可看到UI变化。AOT编译提供接近原生Swift/Kotlin应用程序的性能。根据Google的数据,基于Dart AOT的Flutter即使在中端设备上也能达到60 FPS的动画效果。
Dart开发工具包括Dart SDK(dart编译器、dartanalyzer、dartfmt、pub)、Flutter SDK和IDE插件。Dart SDK与Flutter SDK一起安装在flutter/bin/cache/dart-sdk文件夹中。Pub——包管理器,读取pubspec.yaml并从pub.dev下载依赖项。
dart analyze——静态分析器,检查类型、未使用的导入和潜在错误。dart format——格式化程序,自动将代码调整为统一风格。dart doc——从///注释生成文档。Flutter DevTools——性能分析器,可查看小部件树、日志、内存和网络。Dart VM Service——通过WebSocket调试正在运行的应用程序。
# pubspec.yaml —— Dart项目的配置
name: my_flutter_app
description: A new Flutter project.
version: 1.0.0
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
http: ^1.2.0
provider: ^6.1.0
shared_preferences: ^2.2.0
json_annotation: ^4.8.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.0
json_serializable: ^6.7.0
flutter_lints: ^3.0.0pubspec.yaml文件描述Dart项目的依赖关系。environment:sdk字段指定Dart版本——当前稳定版3.x。Dependencies——主要库,dev_dependencies——用于测试和代码生成。json_annotation + json_serializable通过build_runner生成用于JSON序列化的代码。flutter_lints——分析器的规则集。
常见问题
Dart —— Google(2011)推出的编程语言,专为在Flutter上进行跨平台开发而设计。支持类C语法、严格类型化、JIT和AOT编译。以sound null safety(自Dart 2.12起)和通过Future和Stream实现的异步特性著称。用于移动、Web和桌面应用程序。
Dart编译为原生代码(AOT)或JS(dart2js),JavaScript——被解释。Dart具有带sound null safety的严格类型化、内置类和mixin。Dart的异步基于Isolate(没有共享内存的独立线程),JS——基于带有Web Workers的事件循环。在移动场景中,Dart AOT的性能比V8 JIT高30-50%。
Dart通过Dart Native使用AOT编译为原生ARM代码。在调试模式下,Dart VM使用带有热重载的JIT。Flutter Engine(C++)通过Skia/Impeller渲染UI。对于Android——flutter build apk,对于iOS——flutter build ios。Web编译使用dart2js或dart2wasm。发布版APK大小——15-20 MB(无AAB拆分)。
Dart支持原始类型:int、double、String、bool。集合:List、Set、Map、Record。特殊类型:Symbol、Runes、Null。一切都是对象,包括原始类型。Null safety:int?类型允许null,int——永远不为null。??、??=运算符用于安全地处理null。泛型:List<String>、Map<String, dynamic>。
Flutter SDK包含Dart SDK、Flutter Engine和小部件库。IDE——Android Studio或带有Flutter插件的VS Code。DevTools——带有小部件检查器的性能分析器。Pub.dev——拥有45 000多个库的包管理器。dart analyze分析器和dart format格式化程序——用于代码质量。Build_runner——用于生成JSON模型。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。