Bài 2. Ngôn ngữ Dart cơ bản

Dart là ngôn ngữ của Flutter: cú pháp quen thuộc kiểu C/Java/JavaScript, có kiểu tĩnh và null safety. Bài này trang bị đủ Dart để viết ứng dụng Flutter.

60 phútCơ bản
Bạn sẽ học được
  • Khai báo biến với var, final, const và kiểu
  • Dùng chuỗi, điều kiện, vòng lặp, hàm
  • Làm việc với List, Map, Set
  • Hiểu null safety: ?, !, ??, late
Thuật ngữ cần biết
final
Gán một lần, giá trị xác định lúc chạy.
const
Hằng số xác định lúc biên dịch.
Null safety
Kiểu mặc định không nhận null; muốn nhận phải thêm ?.
Named parameter
Tham số truyền theo tên, đặt trong {}.

Khái niệm và lý thuyết

Dart có kiểu tĩnh với suy luận kiểu (var), giống TypeScript. Từ Dart 3, sound null safety là bắt buộc: biến kiểu String không bao giờ null; muốn cho phép null phải ghi String?. Trình biên dịch đảm bảo không có lỗi null bất ngờ khi chạy.

Trong Flutter, const rất quan trọng: widget const được tạo một lần và tái sử dụng, giúp giảm việc dựng lại giao diện.

Biến, kiểu và chuỗi

void main() {
  var ten = 'An';            // String
  int tuoi = 20;
  double diem = 8.5;
  bool daTotNghiep = false;
  final homNay = DateTime.now();
  const pi = 3.14159;
  print('$ten $tuoi tuổi, điểm ${diem.toStringAsFixed(1)}');
}

Điều kiện, vòng lặp, switch

for (var i = 1; i <= 5; i++) print(i);
for (final mon in ['Toán', 'Tin']) print(mon);
String xepLoai(double d) => switch (d) {
  >= 8.5 => 'Giỏi',
  >= 7   => 'Khá',
  >= 5   => 'Trung bình',
  _      => 'Yếu',
};

Biểu thức switch với pattern (Dart 3) gọn hơn chuỗi if/else.

Hàm và tham số đặt tên

int tong(int a, int b) => a + b;
void chao({required String ten, String loiChao = 'Xin chào'}) {
  print('$loiChao $ten');
}
chao(ten: 'Bình');   // giống cách truyền thuộc tính cho widget

Collection

final ds = <int>[3, 1, 2];
ds.add(5);
final chan = ds.where((x) => x.isEven).toList();
final binhPhuong = ds.map((x) => x * x).toList();
final diem = {'toan': 8, 'van': 7};          // Map<String, int>
final mau = {'đỏ', 'xanh'};                  // Set
final tatCa = [...ds, if (diem.isNotEmpty) 100, for (var x in ds) x * 10];

Null safety

String? email;                 // có thể null
print(email?.length);          // null nếu email null
print(email ?? 'chưa có');     // giá trị thay thế
email ??= Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.';      // gán nếu đang null
late final String cauHinh;     // khởi tạo sau, trước khi dùng
Mẹo hay

Dùng DartPad (dartpad.dev) để thử nhanh mã Dart và cả Flutter ngay trên trình duyệt, không cần cài đặt.

Lưu ý

Toán tử ! (ép không null) sẽ ném lỗi nếu giá trị thật sự null. Ưu tiên ?., ?? hoặc kiểm tra if (x != null).

Thực hành
  1. Viết hàm tính điểm trung bình từ List<double> và xếp loại bằng switch.
  2. Dùng Map lưu danh bạ tên → số điện thoại, in các số bắt đầu bằng 09.
  3. Viết hàm có tham số đặt tên taoTaiKhoan({required String ten, int tuoi = 18}).
  4. Khai báo biến String? và thử các toán tử ?., ??, ??=.
Tóm tắt bài học
  • Dart có kiểu tĩnh, suy luận kiểu và null safety.
  • final/const giúp mã an toàn và Flutter hiệu quả.
  • Tham số đặt tên là nền tảng cách dùng widget.
  • Collection if/for và spread giúp dựng danh sách gọn.