Dart:什么是它,Flutter语言的特点和编程

作者: IT Sectr 发布日期: 2026-02-10 阅读时间: 12 分钟

Dart —— Google推出的编程语言,专为跨平台框架Flutter而设计。它结合了JIT编译以实现闪电般的热重载,以及AOT编译以实现发布版本的原生性能。Dart不仅用于移动开发,还用于Web应用程序(AngularDart)和服务器解决方案。更多关于该语言功能的信息,请阅读Dart官方文档

要点

  • Dart —— Google创建的Flutter语言,支持JIT/AOT编译
  • Null safety —— Dart 2.12起sound null safety保证没有空错误
  • Isolate —— 通过隔离线程实现并行,无共享内存
  • Flutter —— 通过Skia/Impeller渲染小部件的UI框架
  • Pub.dev —— 包管理器,拥有45 000多个用于Dart和Flutter的库

什么是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生态系统

Dart生态系统包括三个主要方向:Flutter(移动和桌面应用程序)、AngularDart(Web应用程序)和Dart Server(服务器解决方案)。Flutter——占主导地位的平台:根据Statista(2025)的数据,Flutter用于46%的跨平台移动项目,领先于React Native(38%)和Xamarin(8%)。

Dart语法:类型、函数和类

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
// 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检查。

类和mixin

Dart中的类——单一继承(extends),通过mixin实现多重继承(mixin)。Dart不支持接口作为独立概念——任何类都可以被实现(implements)。Mixin——没有构造函数的类,其方法和字段可以通过with关键字添加到任何类中。

dart
// 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中的异步通过Future(单一值)、Stream(值序列)和async/await实现。Dart使用单线程事件循环模型,类似于JavaScript,但有一个重要区别:长时间计算不会阻塞UI,因为Dart代码在Isolate中执行——没有共享内存的独立线程。

Future表示一个在一段时间后完成的异步操作。Future可以处于pending(等待)、completed with value(成功)或completed with error(错误)状态。.then().catchError()链——async/await的替代方案,但为了可读性建议使用await。

dart
// 使用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:应用程序架构

Dart和Flutter形成一个统一的栈:Flutter——UI框架,Dart——描述UI的语言。在Flutter中,一切都是小部件(Widget)——从按钮到整个应用程序。小部件可以是stateful(具有可变状态)和stateless(不可变)。Dart描述声明式UI:build()返回一个小部件树,Flutter使用Skia(或在iOS上使用Impeller)进行渲染。

Flutter应用程序的结构

Flutter应用程序由main() → runApp(MyApp()) → MaterialApp组成。MaterialApp包括路由(routes)、主题(theme)和本地化。每个屏幕都是一个Scaffold,包含AppBar、Body(通常为Column/ListView)和BottomNavigationBar。通过Navigator.push/pop或命名路由进行导航。

dart
// 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 vs AOT

Dart编译——混合型:JIT用于开发,AOT用于生产。在调试模式下,Dart VM运行JIT编译器,该编译器解释字节码并支持热代码替换。在发布版本中,dart compile exe或flutter build为特定架构(arm64、x86_64、armv7)创建原生AOT二进制文件。

模式编译执行速度二进制大小热重载
DebugJIT (VM)中等~50 MB
ReleaseAOT (Native)最大~15-20 MB
Webdart2js取决于浏览器可变开发服务器

Dart在调试模式下的JIT编译提供约1秒的热重载——开发者无需丢失应用程序状态即可看到UI变化。AOT编译提供接近原生Swift/Kotlin应用程序的性能。根据Google的数据,基于Dart AOT的Flutter即使在中端设备上也能达到60 FPS的动画效果。

Dart开发工具

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调试正在运行的应用程序。

yaml
# 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.0

pubspec.yaml文件描述Dart项目的依赖关系。environment:sdk字段指定Dart版本——当前稳定版3.x。Dependencies——主要库,dev_dependencies——用于测试和代码生成。json_annotation + json_serializable通过build_runner生成用于JSON序列化的代码。flutter_lints——分析器的规则集。

常见问题

什么是Dart?

Dart —— Google(2011)推出的编程语言,专为在Flutter上进行跨平台开发而设计。支持类C语法、严格类型化、JIT和AOT编译。以sound null safety(自Dart 2.12起)和通过Future和Stream实现的异步特性著称。用于移动、Web和桌面应用程序。

Dart与JavaScript有何不同?

Dart编译为原生代码(AOT)或JS(dart2js),JavaScript——被解释。Dart具有带sound null safety的严格类型化、内置类和mixin。Dart的异步基于Isolate(没有共享内存的独立线程),JS——基于带有Web Workers的事件循环。在移动场景中,Dart AOT的性能比V8 JIT高30-50%。

Dart如何编译成移动应用程序?

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支持哪些数据类型?

Dart支持原始类型:int、double、String、bool。集合:List、Set、Map、Record。特殊类型:Symbol、Runes、Null。一切都是对象,包括原始类型。Null safety:int?类型允许null,int——永远不为null。??、??=运算符用于安全地处理null。泛型:List<String>、Map<String, dynamic>。

Dart开发需要哪些工具?

Flutter SDK包含Dart SDK、Flutter Engine和小部件库。IDE——Android Studio或带有Flutter插件的VS Code。DevTools——带有小部件检查器的性能分析器。Pub.dev——拥有45 000多个库的包管理器。dart analyze分析器和dart format格式化程序——用于代码质量。Build_runner——用于生成JSON模型。

总结

  • Dart —— Google用于Flutter的语言,结合了JIT开发和AOT性能
  • Sound null safety自Dart 2.12起(+3.0)——在类型级别强制保护免受null影响
  • 异步通过Future(单一结果)、Stream(序列)、Isolate(并行)实现
  • Flutter ——声明式UI框架,其中一切都是小部件(StatelessWidget / StatefulWidget)
  • 热重载——约1秒内JIT重新加载,不丢失应用程序状态
  • Pub.dev ——包生态系统(45 000+),通过pubspec.yaml管理
  • Flutter DevTools ——带有小部件、内存和网络检查器的性能分析器

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读