Dart là ngôn ngữ lập trình của Google, được tạo ra đặc biệt cho framework đa nền tảng Flutter. Nó kết hợp biên dịch JIT để tải lại nóng cực nhanh và biên dịch AOT để có hiệu suất native trong các bản build phát hành. Dart không chỉ được sử dụng trong phát triển di động mà còn cho các ứng dụng web (AngularDart) và giải pháp máy chủ. Tìm hiểu thêm về khả năng của ngôn ngữ trong tài liệu chính thức của Dart.
Những điểm chính
Dart là ngôn ngữ lập trình có cú pháp giống C, được Google phát triển dưới sự lãnh đạo của Lars Bak (người tạo ra Eclipse). Bản phát hành đầu tiên vào năm 2011, nhưng Dart thực sự trở nên phổ biến vào năm 2018 với sự ra mắt của Flutter 1.0. Ngôn ngữ được thiết kế để xây dựng giao diện người dùng: nó có hỗ trợ tích hợp cho stream, future và các mẫu phản ứng.
Triết lý của Dart là “cân bằng giữa hiệu suất và năng suất”. Ngôn ngữ hỗ trợ hai chiến lược biên dịch: JIT (Just-In-Time) để phát triển với tải lại nóng và AOT (Ahead-Of-Time) cho các bản build phát hành với hiệu suất native. Trình biên dịch JIT tiêm mã đã sửa đổi vào ứng dụng đang chạy trong mili giây mà không cần biên dịch lại APK — đây là lợi thế chính của Dart so với các ngôn ngữ khác trong phát triển di động.
Tính năng chính của Dart là sound null safety, được giới thiệu trong Dart 2.12 (2021). Hệ thống kiểu đảm bảo rằng một biến không thể là null nếu không có khai báo rõ ràng (int?). Điều này loại bỏ NullPointerException tại thời điểm biên dịch. Theo Google, việc áp dụng null safety đã giảm tỷ lệ crash trong các ứng dụng Flutter xuống 30% trong môi trường sản xuất.
Hệ sinh thái Dart bao gồm ba lĩnh vực chính: Flutter (ứng dụng di động và desktop), AngularDart (ứng dụng web) và Dart Server (giải pháp máy chủ). Flutter là nền tảng thống trị: theo Statista (2025), Flutter được sử dụng trong 46% các dự án di động đa nền tảng, vượt qua React Native (38%) và Xamarin (8%).
Cú pháp Dart giống Java và JavaScript nhưng có các cấu trúc độc đáo riêng. Mọi thứ trong Dart đều là đối tượng — ngay cả int, double và bool cũng kế thừa từ Object. Kiểu là tùy chọn: biến được khai báo là var sẽ tự động suy luận kiểu, nhưng nên chỉ định kiểu rõ ràng để dễ đọc và hiệu suất.
Dart hỗ trợ int, double, String, bool, List, Set, Map, Record, Symbol và Runes. Kiểu nullable — bất kỳ kiểu nào có hậu tố ? (int?, String?). Toán tử ?? (null-aware) trả về giá trị bên phải nếu bên trái là null. Ký pháp xếp tầng (..) cho phép gọi nhiều phương thức trên cùng một đối tượng mà không cần lặp lại tham chiếu.
// Kiểu cơ bản và khai báo trong Dart
void main() {
// Kiểu tường minh
int age = 25;
double price = 19.99;
String name = 'Dart';
bool isValid = true;
// Null safety — biến có thể là null
int? nullableAge = null;
int result = nullableAge ?? 0; // Toán tử null-aware
// Bộ sưu tập với generics
List<String> items = ['Dart', 'Flutter', 'Mobile'];
Map<String, dynamic> config = {
'version': '3.0',
'mode': 'debug',
};
// Ký pháp xếp tầng
final list = <String>[]
..add('one')
..add('two')
..sort();
}
// Record — kiểu bất biến ẩn danh
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'Kiểu dynamic vô hiệu hóa kiểm tra kiểu — chỉ sử dụng nó khi làm việc với JSON hoặc dữ liệu động. Record là kiểu mới trong Dart 3.0 cho phép nhóm các giá trị mà không cần tạo lớp riêng. Toán tử null-aware ?? là cách tiêu chuẩn để làm việc với các giá trị nullable, thay thế các kiểm tra if-else dài.
Lớp trong Dart — kế thừa đơn (extends), đa kế thừa qua mixin (mixin). Dart không hỗ trợ interface như một khái niệm riêng biệt — bất kỳ lớp nào cũng có thể được implement (implements). Mixin là một lớp không có hàm tạo mà các phương thức và trường của nó có thể được thêm vào bất kỳ lớp nào bằng cách sử dụng từ khóa with.
// Lớp, kế thừa và mixin trong Dart
abstract class Animal {
void sound(); // phương thức trừu tượng
}
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...
}
// Hàm tạo có tên
class Config {
final String env;
Config.development() : env = 'dev';
Config.production() : env = 'prod';
}Lớp Duck kế thừa từ Animal và sử dụng hai mixin — Swimmer và Flyer. Điều này thể hiện đa kế thừa mà không có vấn đề hình thoi: các mixin được giải quyết tuyến tính (super chain). Hàm tạo có tên (Config.development) là một giải pháp thay thế cho các phương thức factory tĩnh để tạo đối tượng với các tham số được đặt trước.
Bất đồng bộ trong Dart được triển khai qua Future (giá trị đơn), Stream (chuỗi giá trị) và async/await. Dart sử dụng mô hình đơn luồng với vòng lặp sự kiện, tương tự JavaScript, nhưng có một điểm khác biệt quan trọng: các tính toán dài không chặn UI vì mã Dart chạy trong Isolate — một luồng riêng biệt không có bộ nhớ dùng chung.
Future đại diện cho một hoạt động bất đồng bộ sẽ hoàn thành sau một khoảng thời gian. Future có thể ở trạng thái đang chờ, hoàn thành với giá trị hoặc hoàn thành với lỗi. Chuỗi .then().catchError() là một giải pháp thay thế cho async/await, nhưng nên sử dụng await để dễ đọc.
// Tải dữ liệu bất đồng bộ với Future và Stream
import 'dart:convert';
import 'package:http/http.dart' as http;
class ApiService {
final String baseUrl;
ApiService(this.baseUrl);
// Future cho một yêu cầu đơn
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 cho một chuỗi dữ liệu
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');
// Sử dụng await
final user = await api.fetchUser(1);
print('User: ${user['name']}');
// Xử lý Stream với await for
await for (final count in api.countStream(5)) {
print('Count: $count');
}
}Lớp ApiService thể hiện hai loại bất đồng bộ: Future cho yêu cầu HTTP (phản hồi đơn) và Stream cho bộ đếm tuần tự (trình tạo với async* và yield). Stream hiệu quả để làm việc với cảm biến, định vị địa lý, Firebase Realtime Database — bất cứ nơi nào dữ liệu đến liên tục. Isolate sử dụng bộ nhớ riêng biệt — dữ liệu được truyền qua SendPort/ReceivePort.
Dart và Flutter tạo thành một ngăn xếp duy nhất: Flutter là framework UI, Dart là ngôn ngữ mô tả UI. Trong Flutter, mọi thứ đều là widget — từ một nút đến toàn bộ ứng dụng. Widget có thể là stateful (có trạng thái thay đổi) và stateless (không thay đổi). Dart mô tả UI khai báo: build() trả về một cây widget mà Flutter hiển thị bằng Skia (hoặc Impeller trên iOS).
Ứng dụng Flutter trong Dart bao gồm main() → runApp(MyApp()) → MaterialApp. MaterialApp bao gồm định tuyến (routes), chủ đề (theme) và bản địa hóa. Mỗi màn hình là một Scaffold chứa AppBar, Body (thường là Column/ListView) và BottomNavigationBar. Điều hướng qua Navigator.push/pop hoặc các route có tên.
// Ứng dụng Flutter đơn giản trong Dart
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),
),
);
}
}Widget HomeScreen là một StatefulWidget với trạng thái nội bộ _counter. Gọi setState() thông báo cho Flutter xây dựng lại UI — mã Dart chạy lại build(), tạo một cây widget mới. Flutter so sánh (diff) hiệu quả cây cũ và cây mới, chỉ cập nhật các phần đã thay đổi của màn hình. Hot Reload thay thế build() mà không đặt lại trạng thái _counter.
Biên dịch Dart là hybrid: JIT cho phát triển và AOT cho sản xuất. Ở chế độ gỡ lỗi, Dart VM chạy trình biên dịch JIT để thông dịch bytecode với khả năng hoán đổi nóng mã. Ở chế độ phát hành, dart compile exe hoặc flutter build tạo một tệp nhị phân AOT native cho kiến trúc cụ thể (arm64, x86_64, armv7).
| Chế độ | Biên dịch | Tốc độ thực thi | Kích thước tệp nhị phân | Hot Reload |
|---|---|---|---|---|
| Debug | JIT (VM) | Trung bình | ~50 MB | Có |
| Release | AOT (Native) | Tối đa | ~15-20 MB | Không |
| Web | dart2js | Phụ thuộc vào trình duyệt | Thay đổi | Máy chủ dev |
Biên dịch JIT của Dart ở chế độ gỡ lỗi cung cấp tải lại nóng trong ~1 giây — nhà phát triển thấy các thay đổi UI mà không mất trạng thái ứng dụng. Biên dịch AOT mang lại hiệu suất gần với các ứng dụng Swift/Kotlin native. Theo Google, Flutter trên Dart AOT đạt 60 FPS hoạt ảnh ngay cả trên các thiết bị tầm trung.
Công cụ phát triển Dart bao gồm Dart SDK (trình biên dịch dart, dartanalyzer, dartfmt, pub), Flutter SDK và plugin IDE. Dart SDK được cài đặt cùng với Flutter SDK trong thư mục flutter/bin/cache/dart-sdk. Pub là trình quản lý gói đọc pubspec.yaml và tải các phụ thuộc từ pub.dev.
dart analyze — trình phân tích tĩnh kiểm tra kiểu, import không sử dụng và lỗi tiềm ẩn. dart format — trình định dạng tự động định dạng mã theo phong cách nhất quán. dart doc — trình tạo tài liệu từ các comment ///. Flutter DevTools — trình phân tích với trình kiểm tra cây widget, nhật ký, bộ nhớ và mạng. Dart VM Service — gỡ lỗi ứng dụng đang chạy qua WebSocket.
# pubspec.yaml — cấu hình dự án 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.0Tệp pubspec.yaml mô tả các phụ thuộc của dự án Dart. Trường environment:sdk chỉ định phiên bản Dart — phiên bản ổn định hiện tại là 3.x. Dependencies là các thư viện chính, dev_dependencies dành cho kiểm thử và tạo mã. json_annotation + json_serializable tạo mã tuần tự hóa JSON qua build_runner. flutter_lints là một bộ quy tắc cho trình phân tích.
Câu hỏi thường gặp
Dart là ngôn ngữ lập trình của Google (2011), được thiết kế cho phát triển đa nền tảng với Flutter. Hỗ trợ cú pháp giống C, kiểu mạnh, biên dịch JIT và AOT. Đặc trưng bởi sound null safety (từ Dart 2.12) và bất đồng bộ qua Future và Stream. Được sử dụng cho các ứng dụng di động, web và desktop.
Dart biên dịch thành mã native (AOT) hoặc JS (dart2js), JavaScript được thông dịch. Dart có kiểu mạnh với sound null safety, lớp tích hợp và mixin. Bất đồng bộ của Dart dựa trên Isolate (các luồng riêng biệt không có bộ nhớ dùng chung), JS — dựa trên vòng lặp sự kiện với Web Workers. Hiệu suất Dart AOT cao hơn V8 JIT 30-50% trong các tình huống di động.
Dart biên dịch AOT thành mã ARM native qua Dart Native. Ở chế độ gỡ lỗi, Dart VM sử dụng JIT với tải lại nóng. Flutter Engine (C++) hiển thị UI qua Skia/Impeller. Cho Android — flutter build apk, cho iOS — flutter build ios. Bản build web sử dụng dart2js hoặc dart2wasm. Kích thước APK phát hành là 15-20 MB (không phân chia AAB).
Dart hỗ trợ kiểu nguyên thủy: int, double, String, bool. Bộ sưu tập: List, Set, Map, Record. Đặc biệt: Symbol, Runes, Null. Mọi thứ đều là đối tượng, bao gồm cả kiểu nguyên thủy. Null safety: int? cho phép null, int không bao giờ là null. Toán tử ??, ??= để xử lý null an toàn. Generics: List<String>, Map<String, dynamic>.
Flutter SDK bao gồm Dart SDK, Flutter Engine và thư viện widget. IDE — Android Studio hoặc VS Code với plugin Flutter. DevTools — trình phân tích với trình kiểm tra widget. Pub.dev — trình quản lý gói với hơn 45.000 thư viện. Các công cụ dart analyze và dart format đảm bảo chất lượng mã. Build_runner để tạo mã cho các mô hình JSON.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm