Dart là một ngôn ngữ lập trình hiện đại, mạnh mẽ do Google phát triển, được thiết kế để xây dựng các ứng dụng hiệu suất cao trên nhiều nền tảng, đặc biệt là trong phát triển ứng dụng di động với Flutter. Với cú pháp đơn giản, dễ học nhưng vẫn linh hoạt và mạnh mẽ, Dart ngày càng trở nên phổ biến trong cộng đồng lập trình viên. Nếu bạn đang cần làm quen với Dart, hướng dẫn Dart tutorial này sẽ giúp bạn bắt đầu sử dụng Dart một cách nhanh chóng nhất.

Đọc bài viết Dart tutorial sau đây để hiểu thêm về:

  • Hướng dẫn cài đặt môi trường lập trình Dart
  • Hướng dẫn làm quen với các thành phần cơ bản trong Dart 
  • Hướng dẫn viết chương trình đầu tiên sử dụng ngôn ngữ lập trình Dart 
  • Hướng dẫn lập trình hướng đối tượng trong Dart 
  • Hướng dẫn xử lý lỗi và ngoại lệ trong Dart 
  • Hướng dẫn viết một ứng dụng CLI bằng Dart 

Đọc thêm: Dart là gì? Cú pháp, Đặc điểm, Ứng dụng thực tế của Dart

Dart tutorial: Các bước cài đặt môi trường phát triển 

Trước khi bắt đầu lập trình với Dart, bạn cần thiết lập môi trường phát triển phù hợp. Trong phần này, chúng ta sẽ hướng dẫn cách cài đặt Dart SDK trên các hệ điều hành phổ biến, sử dụng Dart trực tiếp trên trình duyệt với DartPad và thiết lập trình soạn thảo hỗ trợ Dart như Visual Studio Code hoặc IntelliJ IDEA.

Cài đặt Dart SDK

Dart SDK là bộ công cụ cần thiết để biên dịch và chạy mã Dart. Bạn có thể cài đặt Dart SDK trên Windows, macOS và Linux theo hướng dẫn sau:

Cài đặt Dart SDK trên Windows

  • Truy cập trang chính thức của Dart: https://dart.dev/get-dart
  • Chọn tab Windows và tải về file cài đặt.
  • Chạy file .exe và làm theo hướng dẫn trên màn hình.
  • Sau khi cài đặt xong, mở Command Prompt (cmd) hoặc PowerShell, nhập lệnh sau để kiểm tra phiên bản Dart: dart –version 

Cài đặt Dart SDK trên macOS

  • Nếu đã cài Homebrew, bạn có thể cài đặt Dart nhanh chóng bằng lệnh:
brew install dart
  • Kiểm tra phiên bản Dart bằng lệnh:
dart --version

dart tutorial - itviec blog

  • Nếu không sử dụng Homebrew, bạn có thể tải Dart SDK từ trang chính thức và cài đặt thủ công.

Cài đặt Dart SDK trên Linux

  • Thêm kho lưu trữ Dart vào hệ thống:
sudo apt update

sudo apt install apt-transport-https
sudo sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
  • Cài đặt Dart SDK:
sudo apt update
sudo apt install dart
  • Xác minh cài đặt:
dart --version

Sử dụng Dart trong trình duyệt với DartPad

Nếu bạn không muốn cài đặt Dart SDK ngay, bạn có thể thử viết và chạy mã Dart trực tiếp trên trình duyệt bằng DartPad. Cách làm như sau:

  • Truy cập https://dartpad.dev.
  • Bạn sẽ thấy một trình soạn thảo trực tuyến nơi có thể viết và chạy mã Dart.
  • Hãy thử nhập đoạn code sau vào DartPad và nhấn Run để xem kết quả:
void main() {
  print('Xin chào, Dart!');
}

Dart tutorial: Các bước đầu tiên giúp bạn làm quen với lập trình Dart

DartPad là công cụ hữu ích để thử nghiệm nhanh các đoạn mã Dart mà không cần cài đặt môi trường phát triển.

Cài đặt và sử dụng Visual Studio Code hoặc IntelliJ IDEA cho Dart

Để có trải nghiệm lập trình tốt hơn, bạn nên sử dụng một trình soạn thảo hỗ trợ Dart như Visual Studio Code (VS Code) hoặc IntelliJ IDEA. Cả VS Code và IntelliJ IDEA đều hỗ trợ tính năng gợi ý code, gỡ lỗi và tích hợp tốt với Dart, giúp bạn làm việc hiệu quả hơn.

Cài đặt và sử dụng Dart trên VS Code

  • Tải và cài đặt Visual Studio Code 
  • Mở VS Code, vào Extensions (Ctrl + Shift + X), tìm và cài đặt plugin Dart.

dart tutorial - itviec blog

  • Sau khi cài đặt xong, mở terminal trong VS Code và nhập lệnh:
dart create my_project
cd my_project
code 
  • Bạn có thể bắt đầu viết code Dart và chạy bằng lệnh:
dart run

Cài đặt và sử dụng Dart trên IntelliJ IDEA

  • Tải IntelliJ IDEA từ https://www.jetbrains.com/idea/.
  • Mở IntelliJ, vào File > Settings > Plugins, tìm và cài đặt plugin Dart.
  • Tạo một dự án mới, chọn Dart làm ngôn ngữ chính, và bắt đầu lập trình.

Sau khi đã thiết lập môi trường xong, bạn có thể bắt đầu tìm hiểu cú pháp và các tính năng của Dart để viết các ứng dụng mạnh mẽ và linh hoạt.

Dart tutorial: Thao tác với các thành phần cơ bản trong Dart  

Cấu trúc tổng quát của một chương trình Dart

Dart là một ngôn ngữ lập trình có cú pháp đơn giản và dễ tiếp cận, đặc biệt phù hợp với những ai đã từng làm việc với các ngôn ngữ như Java, JavaScript hoặc C#. 

Một chương trình Dart cơ bản bao gồm các thành phần chính như: khai báo thư viện, định nghĩa hàm main(), biến, kiểu dữ liệu, và các câu lệnh điều khiển. Đặc biệt, một chương trình Dart tối thiểu phải có một hàm main(), vì đây là điểm bắt đầu thực thi của chương trình.

Biến và Kiểu dữ liệu

Dart là ngôn ngữ kiểu tĩnh nhưng cũng hỗ trợ kiểu động với var hoặc dynamic.

Ví dụ về khai báo biến:

void main() {
  int age = 25;       // Kiểu số nguyên
  double pi = 3.14;   // Kiểu số thực
  String name = 'Dart'; // Kiểu chuỗi
  bool isLearning = true; // Kiểu boolean

  print('Age: $age, Pi: $pi, Name: $name, Learning: $isLearning');

}

Output:

Age: 25, Pi: 3.14, Name: Dart, Learning: true

Giải thích:

  • int, double, String, bool là các kiểu dữ liệu cơ bản.
  • $variable được sử dụng để chèn giá trị của biến vào chuỗi khi in ra màn hình.

Câu lệnh điều kiện và vòng lặp

Ví dụ về câu lệnh điều kiện:

void main() {
  int number = 10;

  if (number > 0) {
    print('Số dương');
  } else {
    print('Số không hoặc âm');
  }
}

Output:

Số dương

Dart tutorial: Các bước đầu tiên giúp bạn làm quen với lập trình Dart

Ví dụ về vòng lặp for:

void main() {
  for (int i = 1; i <= 5; i++) {
    print('Lần lặp thứ $i');
  }
}

Output:

Lần lặp thứ 1  
Lần lặp thứ 2  
Lần lặp thứ 3  
Lần lặp thứ 4  
Lần lặp thứ 5  

Giải thích:

  • if-else giúp kiểm tra điều kiện và thực hiện các khối lệnh tương ứng.
  • for giúp lặp một đoạn mã với số lần xác định.

Hướng dẫn viết chương trình đầu tiên với Dart

Tạo một ứng dụng Flutter đơn giản

Ứng dụng này có một giao diện với một Text Widget để hiển thị văn bản và một ElevatedButton để thay đổi nội dung khi nhấn nút.

Bước 1: Khởi tạo dự án Flutter

Nếu bạn chưa có dự án Flutter, hãy chạy lệnh sau trong terminal:

flutter create my_first_app

Sau đó, vào thư mục dự án:

cd my_first_app

Bước 2: Viết mã chương trình

Mở file lib/main.dart và thay thế nội dung với đoạn code sau:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _text = "Chào mừng bạn đến với Flutter!";

  void _changeText() {
    setState(() {
      _text = "Bạn đã nhấn nút!";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Ứng dụng Flutter cơ bản")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              _text,
              style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
              textAlign: TextAlign.center,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _changeText,
              child: Text("Nhấn để thay đổi"),
            ),
          ],
        ),
      ),
    );
  }
}

Giải thích:

  1. main(): Hàm khởi chạy ứng dụng Flutter bằng cách gọi runApp(MyApp()).
  2. MyApp: Là một widget Stateless, sử dụng MaterialApp để tạo giao diện cơ bản.
  3. HomeScreen: Là một widget Stateful chứa trạng thái thay đổi khi nhấn nút.
  4. Biến _text: Lưu trữ nội dung hiển thị trên màn hình.
  5. Hàm _changeText(): Dùng setState() để cập nhật nội dung văn bản khi nhấn nút.
  6. Scaffold: Cung cấp giao diện chính với AppBar, Text, và ElevatedButton.

Chạy ứng dụng

Sau khi viết xong code, bạn có thể chạy ứng dụng với lệnh:

flutter run 

Ứng dụng sẽ hiển thị một màn hình có nội dung ban đầu là “Chào mừng bạn đến với Flutter!”, và khi nhấn nút, nội dung sẽ thay đổi thành “Bạn đã nhấn nút!”.

Và đây là kết quả sau khi chạy ứng dụng vừa được xây dựng:

Dart tutorial: Các bước đầu tiên giúp bạn làm quen với lập trình Dart

Khai báo thư viện (Import Libraries)

Dart cung cấp nhiều thư viện có sẵn để hỗ trợ lập trình. Bạn có thể sử dụng import để thêm các thư viện vào chương trình.

Ví dụ, để sử dụng các hàm toán học mở rộng:

import 'dart:math';

void main() {
  print(sqrt(16)); // Tính căn bậc hai của 16
}

Output:

// 4.0

Giải thích: Thay vì phải trình bày công thức tính căn bậc 2 phức tạp thì ta có thể sử dụng thư viện ‘dart:math’ để tính căn bậc 2 một cách đơn giản và tiết kiệm thời gian cho các bài toán lớn khó và phức tạp hơn, cần nhiều thời gian phân tích hơn.

Đọc thêm: Dart Flutter là gì: Cách xây dựng mobile app với Dart trong Flutter

Hướng dẫn lập trình hướng đối tượng trong Dart

Lớp và đối tượng

Dart là một ngôn ngữ lập trình hướng đối tượng (OOP), trong đó mọi thứ đều là đối tượng. Một lớp (class) là một bản thiết kế (blueprint) để tạo ra các đối tượng (object). Dưới đây là ví dụ về cách định nghĩa một lớp và tạo đối tượng trong Dart:

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void introduce() {
    print('Tôi là $name, $age tuổi.');
  }
}

void main() {
  var person = Person('Nam', 25);
  person.introduce();
}

Constructor và Factory Constructor

Constructor là một phương thức đặc biệt được gọi khi tạo đối tượng. Dart hỗ trợ nhiều loại constructor, bao gồm constructor thông thường và factory constructor.

Constructor thông thường

class Animal {
  String species;
  Animal(this.species);
}

Factory Constructor

Factory constructor được sử dụng khi cần kiểm soát quá trình tạo đối tượng, chẳng hạn như trả về một đối tượng đã tồn tại thay vì tạo mới:

class Singleton {
  static final Singleton _instance = Singleton._internal();

  factory Singleton() {
    return _instance;
  }

  Singleton._internal();
}

Kế thừa và đa hình

Kế thừa giúp một lớp con có thể sử dụng và mở rộng tính năng của lớp cha.

class Animal {
  void makeSound() {
    print('Animal sound');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Gâu gâu!');
  }
}

void main() {
  Dog dog = Dog();
  dog.makeSound(); // Output: Gâu gâu!
}

Interface và mixin (implements, with)

Dart không có từ khóa interface, nhưng mọi lớp đều có thể được sử dụng như một interface.

abstract class Logger {
  void log(String message);
}

class ConsoleLogger implements Logger {
  @override
  void log(String message) {
    print('Log: $message');
  }
}

Mixin giúp một lớp có thể “kế thừa” từ nhiều lớp mà không cần đa kế thừa.

mixin Flyer {
  void fly() => print('Flying...');
}

class Bird with Flyer {}

Xử lý bất đồng bộ trong Dart

Future và async/await

Dart hỗ trợ lập trình bất đồng bộ bằng Futureasync/await. Future đại diện cho một giá trị sẽ có trong tương lai.

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'Dữ liệu đã tải';
}

void main() async {
  print('Bắt đầu tải dữ liệu...');
  String data = await fetchData();
  print(data);
}

Stream và cách làm việc với dữ liệu luồng

Stream giúp xử lý nhiều giá trị không đồng bộ theo thời gian.

Stream<int> countStream() async* {
  for (int i = 1; i <= 5; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

void main() {
  countStream().listen((value) => print('Giá trị: $value'));
}

So sánh Future và Stream

Đặc điểm  Future Stream
Trả về Một giá trị  Nhiều giá trị 
Hoạt động Kết thúc sau mỗi lần hoàn thành  Có thể tiếp tục phát dữ liệu
Cách sử dụng async/await listen()

Hướng dẫn xử lý lỗi và ngoại lệ trong Dart 

Sử dụng try-catch để bắt lỗi

Dart cung cấp try-catch để bắt lỗi và xử lý ngoại lệ.

void main() {
  try {
    int result = 10 ~/ 0;
    print(result);
  } catch (e) {
    print('Lỗi: $e');
  }
}

on, finally và cách quản lý ngoại lệ

  • on dùng để bắt lỗi cụ thể.
  • finally chạy bất kể có lỗi hay không.
void main() {
  try {
    throw FormatException('Lỗi định dạng');
  } on FormatException catch (e) {
    print('Bắt lỗi: $e');
  } finally {
    print('Dọn dẹp tài nguyên.');
  }
}

Hướng dẫn viết một ứng dụng CLI bằng Dart 

Ứng dụng dòng lệnh (Command-Line Interface – CLI) là một trong những loại ứng dụng phổ biến khi làm việc với ngôn ngữ Dart, đặc biệt hữu ích cho việc tự động hóa, xử lý dữ liệu và các tác vụ server-side. Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo một ứng dụng CLI bằng Dart, dựa trên hướng dẫn từ tài liệu chính thức của Dart.

Khởi tạo dự án CLI

Trước tiên, bạn cần cài đặt Dart SDK nếu chưa có. Sau đó, sử dụng lệnh sau để tạo một dự án CLI mới:

dart create -t console my_cli_app

Lệnh trên sẽ tạo một thư mục my_cli_app chứa các tệp cần thiết, bao gồm:

  • bin/my_cli_app.dart: Tệp chính của ứng dụng.
  • pubspec.yaml: Tệp cấu hình package.

Sau khi tạo xong, di chuyển vào thư mục dự án và chạy thử ứng dụng CLI:

cd my_cli_app
dart run

Mặc định, chương trình sẽ in ra Hello, world! từ tệp bin/my_cli_app.dart.

Xử lý tham số dòng lệnh

Dart cho phép bạn truy cập các tham số dòng lệnh thông qua danh sách List<String> arguments được truyền vào hàm main(). Ví dụ:

void main(List<String> arguments) {
  if (arguments.isEmpty) {
    print('Vui lòng nhập một tham số!');
    return;
  }

  print('Tham số nhận được: ${arguments.join(", ")}');
}

Chạy thử với:

dart run bin/my_cli_app.dart hello world

Kết quả:

Tham số nhận được: hello, world

Sử dụng package args để xử lý tham số

Để làm cho ứng dụng CLI mạnh mẽ hơn, chúng ta có thể sử dụng package args để phân tích cú pháp tham số một cách linh hoạt. Cài đặt package bằng lệnh:

dart pub add args

Sau đó, chỉnh sửa bin/my_cli_app.dart để sử dụng ArgParser:

import 'package:args/args.dart';
void main(List<String> arguments) {
  var parser = ArgParser()
    ..addOption('name', abbr: 'n', help: 'Tên của bạn')
    ..addFlag('verbose', abbr: 'v', negatable: false, help: 'Bật chế độ chi tiết');

  var argResults = parser.parse(arguments);

  if (argResults.wasParsed('name')) {
    print('Xin chào, ${argResults['name']}!');
  } else {
    print('Xin chào, người dùng!');
  }

  if (argResults['verbose']) {
    print('Chế độ chi tiết đã được bật.');
  }
}

Chạy thử:

dart run bin/my_cli_app.dart --name=Dart --verbose

Kết quả:

Xin chào, Dart!
Chế độ chi tiết đã được bật.

Tương tác với người dùng qua stdin

Ứng dụng CLI có thể đọc dữ liệu từ người dùng bằng stdin:

import 'dart:io';

void main() {

  stdout.write('Nhập tên của bạn: ');

  String? name = stdin.readLineSync();

  print('Xin chào, $name!');

}

Chạy thử:

dart run bin/my_cli_app.dart

Ứng dụng sẽ yêu cầu nhập tên và hiển thị kết quả tương ứng.

Xây dựng và chạy ứng dụng CLI

Sau khi hoàn thiện ứng dụng CLI, bạn có thể biên dịch nó thành một tệp nhị phân để chạy mà không cần Dart SDK:

dart compile exe bin/my_cli_app.dart -o my_cli_app

Chạy ứng dụng đã biên dịch:

./my_cli_app --name=Dart

Kết quả:

Xin chào, Dart!

Các câu hỏi thường gặp về dart tutorial

Dart có hỗ trợ lập trình server không?

Có, bạn có thể dùng Dart để viết server với package như shelf hoặc dart_frog.

Ví dụ với shelf:

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;

void main() async {
  var handler = Pipeline().addHandler((request) => Response.ok('Hello, Dart!'));
  await io.serve(handler, 'localhost', 8080);
}

Có thể tìm hiểu và học Dart-Flutter ở đâu?

Dưới đây là một số nguồn tài liệu tốt nhất để tìm hiểu về Dart và Flutter từ cơ bản đến nâng cao:

Tài liệu chính thức

  • Flutter Documentation – Hướng dẫn từ cơ bản đến nâng cao, bao gồm cách cài đặt, sử dụng widget, state management, testing, v.v.
  • Dart Documentation – Học ngôn ngữ Dart, từ cú pháp cơ bản đến lập trình bất đồng bộ, xử lý ngoại lệ, và tối ưu hiệu suất.

Các khóa học miễn phí và chính thức

Khóa học trên Youtube

  • The Flutter Way – Hướng dẫn chi tiết về UI/UX với Flutter.
  • Flutter Mapp – Học Flutter từ cơ bản đến nâng cao qua các dự án thực tế.
  • Academind – Flutter – Hướng dẫn chuyên sâu về Flutter, UI, state management.
  • Reso Coder – Video về kiến trúc, clean code, testing trong Flutter.

Blog và Website hữu ích

  • Flutter Awesome – Bộ sưu tập các dự án mã nguồn mở tốt nhất về Flutter.
  • Raywenderlich Flutter – Hướng dẫn, bài viết chuyên sâu về Flutter.
  • FilledStacks – Chia sẻ kinh nghiệm, kiến trúc, state management trong Flutter.
  • Flutter Gems – Tìm kiếm thư viện Flutter theo danh mục.

Tổng kết 

Bằng cách nắm vững cú pháp, lập trình hướng đối tượng, lập trình bất đồng bộ và các thư viện cốt lõi của Dart, bạn có thể xây dựng các ứng dụng hiệu suất cao, dễ bảo trì. Hành trình học Dart không chỉ dừng lại ở việc hiểu cú pháp mà còn bao gồm việc áp dụng nó vào các dự án thực tế. Hãy thực hành thường xuyên, khám phá các thư viện hữu ích và tham gia vào cộng đồng để cập nhật những xu hướng mới nhất. Với nền tảng vững chắc về Dart, bạn sẽ có một lợi thế lớn trong việc phát triển ứng dụng di động, web và server-side hiện đại.