- Dart là gì?
Dart là một ngôn ngữ lập trình mã nguồn mở được phát triển bởi Google, được sử dụng để xây dựng các ứng dụng có thể chạy trên nhiều nền tảng khác nhau. Hiện nay, Dart được biết đến nhiều nhất vì đây là ngôn ngữ lập trình chính được sử dụng trong Flutter.
Dart được thiết kế theo hướng hiện đại, hỗ trợ lập trình hướng đối tượng, kiểu dữ liệu rõ ràng, Null Safety, lập trình bất đồng bộ và nhiều tính năng khác phục vụ cho việc phát triển ứng dụng.
Có thể hiểu đơn giản: Dart → Ngôn ngữ lập trình → Flutter → Framework phát triển ứng dụng → Mobile/Web/Desktop.
Dart không phải là Flutter. Dart là ngôn ngữ dùng để viết code, còn Flutter là framework được xây dựng dựa trên Dart để phát triển ứng dụng. Vì vậy, nếu muốn học Flutter thì trước tiên cần có kiến thức nền tảng về Dart.
- Dart được sử dụng để làm gì?
Dart có thể được sử dụng để phát triển nhiều loại ứng dụng khác nhau. Tuy nhiên, mục đích sử dụng phổ biến nhất hiện nay là kết hợp với Flutter để xây dựng ứng dụng đa nền tảng.
Dart có thể được sử dụng để phát triển:
- Ứng dụng Android và iOS thông qua Flutter.
- Ứng dụng Web.
- Ứng dụng Desktop.
- Các chương trình Command-line.
- Một số ứng dụng và công cụ phía server.
Một trong những điểm mạnh của Dart là có khả năng biên dịch để chạy trên nhiều môi trường khác nhau. Có thể hình dung: Dart Code → Compiler → Native / JavaScript / WebAssembly → Ứng dụng.
Nhờ đó, Dart không bị giới hạn trong một loại thiết bị hoặc nền tảng duy nhất.
- Dart hoạt động như thế nào?
Dart có nhiều cách thực thi tùy vào môi trường sử dụng. Hai khái niệm quan trọng khi tìm hiểu Dart là JIT (Just-In-Time) và AOT (Ahead-Of-Time).
JIT có nghĩa là code được biên dịch trong quá trình chương trình chạy. Cách này phù hợp với quá trình phát triển vì giúp lập trình viên có thể thay đổi code và xem kết quả nhanh chóng.
Trong Flutter, JIT có liên quan đến quá trình phát triển và tính năng Hot Reload. Khi sửa code, Flutter có thể cập nhật phần thay đổi lên ứng dụng mà không cần phải khởi động lại toàn bộ ứng dụng trong nhiều trường hợp.
Có thể hình dung: Code Dart → JIT → Chạy ứng dụng → Thay đổi code → Hot Reload → Xem kết quả nhanh.
Khi ứng dụng được build để đưa lên môi trường production, Dart có thể sử dụng AOT để biên dịch code thành mã máy trước khi ứng dụng chạy. Có thể hiểu: Code Dart → AOT → Native Machine Code → Ứng dụng Release.
Việc hỗ trợ cả JIT và AOT giúp Dart vừa thuận tiện trong quá trình phát triển vừa có khả năng tạo ứng dụng có hiệu năng tốt khi đưa vào sử dụng.
- Đặc điểm của ngôn ngữ Dart
Dart có nhiều đặc điểm phù hợp với việc phát triển ứng dụng hiện đại. Một số đặc điểm quan trọng gồm:
- Hỗ trợ lập trình hướng đối tượng.
- Có kiểu dữ liệu rõ ràng.
- Hỗ trợ type inference.
- Có Null Safety.
- Hỗ trợ Future và async/await.
- Hỗ trợ Stream.
- Có Isolate để xử lý đồng thời.
- Hỗ trợ JIT và AOT.
- Có hệ thống thư viện và package.
- Có thể phát triển ứng dụng trên nhiều nền tảng.
Ví dụ về type inference:
var name = ‘Thuong’;
var age = 20;
Trong trường hợp này, Dart có thể tự suy luận name là String và age là int.
Mình cũng có thể khai báo rõ kiểu dữ liệu:
String name = ‘Thuong’;
int age = 20;
Việc có hệ thống kiểu dữ liệu rõ ràng giúp code dễ đọc hơn và hỗ trợ phát hiện một số lỗi ngay trong quá trình viết chương trình.
- Dart là ngôn ngữ hướng đối tượng
Dart là một ngôn ngữ lập trình hỗ trợ Object-Oriented Programming (OOP). Khi sử dụng Dart, mình có thể xây dựng chương trình dựa trên class và object.
Dart hỗ trợ nhiều khái niệm quan trọng của OOP như:
- Class và Object.
- Constructor.
- Encapsulation.
- Inheritance.
- Polymorphism.
- Abstract class.
- Interface.
- Mixin.
Đây là phần rất quan trọng khi học Flutter vì trong Flutter mình sẽ làm việc với class và object rất thường xuyên.
- Biến và kiểu dữ liệu trong Dart
Dart hỗ trợ nhiều kiểu dữ liệu cơ bản để lưu trữ và xử lý thông tin.
Một số kiểu thường gặp:
int age = 20;
double price = 15000.5;
String name = ‘Thuong’;
bool isLogin = true;
Trong đó:
- int: số nguyên.
- double: số thực.
- String: chuỗi ký tự.
- bool: giá trị đúng hoặc sai.
Dart cũng hỗ trợ các kiểu collection thường được sử dụng trong lập trình như List, Set và Map.
Ví dụ với List:
List<String> names = [‘An’, ‘Binh’, ‘Thuong’];
Ví dụ với Map:
Map<String, dynamic> user = {
‘name’: ‘Thuong’,
‘age’: 20
};
Trong Flutter, những kiểu dữ liệu này được sử dụng rất nhiều khi xử lý danh sách sản phẩm, dữ liệu từ API, JSON hoặc dữ liệu lấy từ database.
- Null Safety trong Dart
Null Safety là một trong những tính năng quan trọng của Dart. Nó giúp hạn chế các lỗi xảy ra khi chương trình cố gắng sử dụng một giá trị đang là null.
Ví dụ:
String name = ‘Thuong’;
Trong trường hợp này, name không được phép nhận giá trị null.
Nếu muốn cho phép biến có thể nhận null, mình sử dụng dấu ?:
String? name;
Lúc này name có thể là String hoặc có thể là null.
Có thể hiểu đơn giản: String → Không được null, còn String? → Có thể null.
Null Safety giúp Dart kiểm tra những trường hợp có khả năng xảy ra lỗi liên quan đến null ngay trong quá trình phân tích code.
Điều này đặc biệt quan trọng khi làm ứng dụng Flutter vì dữ liệu từ API, database hoặc người dùng nhập vào không phải lúc nào cũng có đầy đủ giá trị.
- Function trong Dart
Function hay hàm là một khối code được sử dụng để thực hiện một nhiệm vụ cụ thể. Function giúp mình chia chương trình thành nhiều phần nhỏ để dễ đọc và dễ sử dụng lại.
Ví dụ:
int sum(int a, int b) {
return a + b;
}
Khi gọi:
int result = sum(10, 20);
Kết quả sẽ là 30.
Dart cũng hỗ trợ viết function ngắn gọn bằng arrow function:
int sum(int a, int b) => a + b;
Function xuất hiện rất nhiều trong Flutter, ví dụ khi xử lý sự kiện người dùng nhấn nút:
onPressed: () {
print(‘Button clicked’);
}
Vì vậy, hiểu Function là kiến thức cơ bản cần có trước khi học sâu Flutter.
- Future và lập trình bất đồng bộ
Trong ứng dụng thực tế, có nhiều thao tác không thể hoàn thành ngay lập tức. Ví dụ như gọi API, đọc dữ liệu từ database, đọc file hoặc gửi dữ liệu lên server.
Nếu chương trình phải chờ những thao tác này hoàn thành rồi mới tiếp tục thì có thể làm ảnh hưởng đến trải nghiệm người dùng.
Dart hỗ trợ lập trình bất đồng bộ thông qua Future, async và await.
Ví dụ:
Future<String> getData() async {
return ‘Data’;
}
Khi sử dụng:
String data = await getData();
Có thể hình dung: Gọi API → Future → Chờ dữ liệu → API trả kết quả → Tiếp tục xử lý.
Future thường được sử dụng khi mình biết rằng một thao tác sẽ trả về kết quả trong tương lai.
Đây là phần rất quan trọng khi làm Flutter vì ứng dụng thực tế thường xuyên phải giao tiếp với API hoặc các nguồn dữ liệu bên ngoài.
- Stream trong Dart
Ngoài Future, Dart còn hỗ trợ Stream. Future thường phù hợp khi mình cần nhận một kết quả trong tương lai, còn Stream phù hợp khi dữ liệu có thể được phát ra nhiều lần theo thời gian.
Có thể hình dung: Stream → Data 1 → Data 2 → Data 3 → Data 4.
Ví dụ, Stream có thể được sử dụng trong những trường hợp cần theo dõi liên tục sự thay đổi của dữ liệu.
Dart cung cấp các API bất đồng bộ trong thư viện dart:async, trong đó có Future và Stream.
Trong Flutter, Stream có thể xuất hiện trong các trường hợp như theo dõi dữ liệu thay đổi, xử lý sự kiện liên tục hoặc kết hợp với một số cơ chế quản lý state.
- Isolate và xử lý đồng thời trong Dart
Dart sử dụng khái niệm Isolate để hỗ trợ xử lý đồng thời. Mỗi isolate có vùng bộ nhớ riêng và không chia sẻ trực tiếp bộ nhớ với isolate khác. Các isolate giao tiếp với nhau thông qua message.
Có thể hình dung: Main Isolate → Gửi Message → Worker Isolate → Xử lý công việc → Trả kết quả.
Điều này giúp Dart có cách xử lý những công việc nặng mà không cần sử dụng mô hình chia sẻ bộ nhớ giữa các isolate.
Trong Flutter, Isolate có thể hữu ích khi cần thực hiện những công việc xử lý dữ liệu lớn hoặc các tác vụ tốn CPU, nhằm hạn chế ảnh hưởng đến giao diện người dùng.
Tuy nhiên, đối với những thao tác bất đồng bộ thông thường như gọi API thì thường sử dụng Future và async/await, không phải lúc nào cũng cần đến Isolate.
- Dart Package và thư viện
Dart có hệ thống thư viện và package giúp lập trình viên sử dụng lại những chức năng đã được xây dựng.
Một số thư viện có sẵn của Dart gồm:
- dart:core
- dart:async
- dart:convert
- dart:math
- dart:io
- dart:isolate
Ví dụ, dart:async cung cấp các thành phần phục vụ lập trình bất đồng bộ, còn dart:convert có thể được sử dụng để xử lý JSON.
Ngoài thư viện có sẵn, Dart còn có hệ thống package để lập trình viên có thể sử dụng thêm các thư viện do cộng đồng hoặc các tổ chức phát triển.
Có thể hình dung: Dart SDK → Thư viện có sẵn → Package bên ngoài → Ứng dụng.
Trong Flutter, package được sử dụng rất nhiều để bổ sung các chức năng như gọi API, quản lý state, lưu dữ liệu local, xử lý hình ảnh hoặc kết nối với các dịch vụ bên ngoài.
- Dart liên quan như thế nào đến Flutter?
Dart và Flutter có mối quan hệ rất chặt chẽ. Dart là ngôn ngữ lập trình, còn Flutter là framework sử dụng Dart để xây dựng ứng dụng.
Có thể hiểu đơn giản: Dart → Ngôn ngữ lập trình → Flutter → Framework → Ứng dụng Android/iOS/Web/Desktop.
Khi viết một ứng dụng Flutter, mình sử dụng Dart để viết logic chương trình và sử dụng các thành phần của Flutter để xây dựng giao diện cũng như xử lý ứng dụng.
Ví dụ:
void main() {
runApp(MyApp());
}
Ở đây, main() là hàm bắt đầu của chương trình Dart, còn runApp() là hàm của Flutter dùng để khởi chạy ứng dụng.
Vì vậy, Dart là kiến thức nền rất quan trọng trước khi học Flutter.
- Ưu điểm của Dart
Sau khi tìm hiểu, mình thấy Dart có một số ưu điểm phù hợp với việc phát triển ứng dụng.
Thứ nhất, Dart có cú pháp tương đối dễ tiếp cận, đặc biệt đối với những người đã từng học các ngôn ngữ hướng đối tượng như Java hoặc C#.
Thứ hai, Dart có kiểu dữ liệu rõ ràng và hỗ trợ Null Safety, giúp hạn chế nhiều lỗi trong quá trình phát triển.
Thứ ba, Dart hỗ trợ cả JIT và AOT. JIT giúp quá trình phát triển và debug thuận tiện hơn, trong khi AOT giúp biên dịch code thành mã máy cho môi trường release.
Thứ tư, Dart hỗ trợ tốt cho lập trình bất đồng bộ thông qua Future, async/await và Stream.
Thứ năm, Dart được sử dụng trực tiếp với Flutter nên có thể xây dựng ứng dụng cho nhiều nền tảng.
Những đặc điểm này giúp Dart phù hợp với việc phát triển ứng dụng đa nền tảng.
- Nhược điểm của Dart
Bên cạnh những ưu điểm, Dart cũng có một số hạn chế.
Dart không phổ biến rộng như một số ngôn ngữ như Java, JavaScript, Python hoặc C#. Vì vậy, nếu chỉ xét riêng Dart thì số lượng dự án và cơ hội việc làm có thể ít hơn so với những ngôn ngữ phổ biến này.
Tuy nhiên, nếu đi theo hướng Flutter thì Dart vẫn là kiến thức bắt buộc vì đây là ngôn ngữ chính được sử dụng để phát triển Flutter.
Ngoài ra, Dart có khá nhiều khái niệm cần học nếu muốn làm dự án Flutter thực tế như OOP, Null Safety, Future, async/await, Stream, Isolate, Generics, Collections và Package.
Vì vậy, mình không nên chỉ học cú pháp Dart mà cần hiểu cách Dart hoạt động và cách áp dụng nó vào Flutter.
- Dart quan trọng như thế nào đối với việc học Flutter?
Theo mình, Dart là phần kiến thức nền rất quan trọng đối với Flutter. Nếu chưa hiểu Dart thì khi học Flutter sẽ dễ gặp tình trạng biết cách viết Widget nhưng lại không hiểu rõ những đoạn code bên trong hoạt động như thế nào.
Trong Flutter, mình sẽ thường xuyên gặp những thành phần của Dart như:
- final
- const
- class
- extends
- Future
- async
- await
- List
- Map
- String?
Những kiến thức này đều thuộc Dart.
Đối với danh sách keyword anh Huy yêu cầu mình học, các phần Dart Fundamentals, Dart OOP, Null Safety, Future & Async/Await và Isolate & Concurrency chính là những kiến thức Dart quan trọng cần nắm trước khi đi sâu vào Flutter.
Có thể hình dung lộ trình: Dart Fundamentals → Dart OOP → Null Safety → Future & Async/Await → Isolate & Concurrency → Flutter Widget Fundamentals.
Nếu nền tảng Dart tốt thì khi học các phần tiếp theo như Widget, State Management, API, Repository hoặc Architecture sẽ dễ hiểu hơn.
- Kết luận
Sau khi tìm hiểu về Dart, mình hiểu rằng Dart là một ngôn ngữ lập trình mã nguồn mở được phát triển bởi Google, hỗ trợ lập trình hướng đối tượng, kiểu dữ liệu rõ ràng, Null Safety, lập trình bất đồng bộ và nhiều tính năng phục vụ cho việc phát triển ứng dụng.
Dart có thể được sử dụng trên nhiều nền tảng và đặc biệt quan trọng đối với Flutter vì Flutter sử dụng Dart làm ngôn ngữ chính để xây dựng ứng dụng.
Một số kiến thức quan trọng mình cần nắm khi học Dart gồm biến và kiểu dữ liệu, Function, OOP, Collection, Null Safety, Future, async/await, Stream, Isolate và Package.
Qua việc tìm hiểu, mình nhận thấy Dart không chỉ đơn giản là ngôn ngữ dùng để viết giao diện Flutter mà còn cung cấp nhiều tính năng cần thiết để xây dựng ứng dụng thực tế.
Tóm lại, mình hiểu Dart là nền tảng ngôn ngữ phía dưới Flutter. Nếu muốn làm Flutter tốt thì trước tiên cần có nền tảng Dart đủ chắc, đặc biệt là OOP, Null Safety, Future/async-await và Isolate. Khi nắm được Dart thì việc học các phần Flutter như Widget, State Management, API, Repository hay Architecture sẽ dễ hiểu hơn.
link tham khảo: https://topdev.vn/blog/dart-la-gi/





Khoá học lập trình game con rắn cho trẻ em




