Giới thiệu về Dart - Ngôn ngữ lập trình của Flutter
Nếu bạn đang tìm hiểu về Flutter, chắc hẳn bạn đã nghe đến Dart - ngôn ngữ lập trình chính thức được sử dụng để xây dựng các ứng dụng Flutter. Dart không chỉ mạnh mẽ mà còn rất dễ học, đặc biệt nếu bạn đã có kinh nghiệm với các ngôn ngữ như Java, JavaScript, hoặc C. Trong bài viết này, mình sẽ giới thiệu chi tiết về Dart, từ những khái niệm cơ bản đến các tính năng nổi bật giúp nó trở thành một ngôn ngữ lý tưởng cho phát triển ứng dụng đa nền tảng.
Dart là gì?
Dart là một ngôn ngữ lập trình hướng đối tượng, được phát triển bởi Google. 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, bao gồm web, máy tính để bàn và di động. Dart có một số đặc điểm nổi bật như:
- Type-safe: Dart sử dụng kiểm tra kiểu tĩnh để đảm bảo rằng giá trị của biến luôn khớp với kiểu dữ liệu được khai báo.
- Sound null safety: Dart hỗ trợ tính năng null safety, giúp tránh các lỗi liên quan đến
null
trong quá trình phát triển. - Dễ học: Cú pháp của Dart rất giống với các ngôn ngữ phổ biến như Java, JavaScript, và C.
Mình sẽ giải thích chi tiết hơn về các đặc điểm này ở phần sau của bài viết.
Ví dụ cơ bản về Dart
Để giúp bạn hình dung rõ hơn về cách Dart hoạt động, hãy cùng xem một ví dụ đơn giản. Chương trình dưới đây sẽ lấy dữ liệu từ một API, giải mã JSON và in kết quả ra console.
import 'dart:convert';
import 'package:http/http.dart' as http;
class Package {
final String name;
final String latestVersion;
final String? description;
Package(this.name, this.latestVersion, {this.description});
String toString() {
return 'Package{name: $name, latestVersion: $latestVersion, description: $description}';
}
}
void main() async {
final httpPackageUrl = Uri.https('dart.dev', '/f/packages/http.json');
final httpPackageResponse = await http.get(httpPackageUrl);
if (httpPackageResponse.statusCode != 200) {
print('Failed to retrieve the http package!');
return;
}
final json = jsonDecode(httpPackageResponse.body);
final package = Package(
json['name'],
json['latestVersion'],
description: json['description'],
);
print(package);
}
Giải thích ví dụ
-
Lớp
Package
:- Lớp này có ba thuộc tính:
name
,latestVersion
, vàdescription
(có thể lànull
). - Constructor của lớp nhận hai giá trị bắt buộc (
name
vàlatestVersion
) và một giá trị tùy chọn (description
). - Phương thức
toString()
được ghi đè để in thông tin của đối tượng.
- Lớp này có ba thuộc tính:
-
Hàm
main
:- Đây là điểm bắt đầu của chương trình Dart.
- Chương trình sử dụng thư viện
http
để gửi yêu cầu GET đến một API và nhận dữ liệu JSON. - Dữ liệu JSON được giải mã và sử dụng để tạo một đối tượng
Package
. - Kết quả được in ra console.
Đặc điểm nổi bật của Dart
1. Type Safety - An toàn về kiểu dữ liệu
Dart là một ngôn ngữ type-safe, nghĩa là nó sử dụng kiểm tra kiểu tĩnh (static type checking) để đảm bảo rằng giá trị của một biến luôn khớp với kiểu dữ liệu được khai báo. Điều này giúp ngăn chặn nhiều lỗi phổ biến liên quan đến kiểu dữ liệu trong quá trình phát triển ứng dụng.
Ví dụ về Type Safety
String name = 'Dart'; // Khai báo biến 'name' với kiểu String
name = 42; // Lỗi: Giá trị 42 không phải là kiểu String
Trong ví dụ trên, Dart sẽ báo lỗi ngay lập tức vì bạn không thể gán một giá trị kiểu int
cho một biến kiểu String
.
2. Type Inference - Suy luận kiểu dữ liệu
Mặc dù Dart yêu cầu khai báo kiểu dữ liệu, nhưng trong nhiều trường hợp, bạn có thể bỏ qua việc khai báo kiểu một cách rõ ràng nhờ vào tính năng type inference (suy luận kiểu). Dart có thể tự động suy ra kiểu dữ liệu của biến dựa trên giá trị được gán cho nó.
Ví dụ về Type Inference
void main() {
final name = 'Dart'; // Dart tự động suy ra kiểu String
final version = 2.12; // Dart tự động suy ra kiểu double
final isCool = true; // Dart tự động suy ra kiểu bool
print(name.runtimeType); // In ra: String
print(version.runtimeType); // In ra: double
print(isCool.runtimeType); // In ra: bool
}
Trong ví dụ này:
- Biến
name
được gán giá trị'Dart'
, nên Dart suy ra kiểu của nó làString
. - Biến
version
được gán giá trị2.12
, nên Dart suy ra kiểu của nó làdouble
. - Biến
isCool
được gán giá trịtrue
, nên Dart suy ra kiểu của nó làbool
.
3. Sound Null Safety - An toàn với giá trị null
Dart hỗ trợ sound null safety, giúp đảm bảo rằng các biến không thể là null
trừ khi được khai báo rõ ràng. Ví dụ:
String name = 'Dart'; // Không thể là null
String? description = null; // Có thể là null
Trong ví dụ trên:
- Biến
name
không thể nhận giá trịnull
. - Biến
description
có thể nhận giá trịnull
nhờ vào dấu?
.
Khi nào cần khai báo kiểu dữ liệu rõ ràng?
Mặc dù type inference rất tiện lợi, nhưng có một số trường hợp bạn nên khai báo kiểu dữ liệu một cách rõ ràng:
-
Khi kiểu dữ liệu không rõ ràng: Nếu giá trị được gán có thể thuộc nhiều kiểu dữ liệu khác nhau, bạn nên khai báo kiểu để tránh nhầm lẫn.
final dynamic data = fetchData(); // Kiểu dữ liệu không rõ ràng final String name = data['name']; // Khai báo rõ ràng kiểu String
-
Khi muốn tăng tính rõ ràng của code: Việc khai báo kiểu dữ liệu giúp code dễ đọc và dễ bảo trì hơn.
final List<int> numbers = [1, 2, 3]; // Khai báo rõ ràng kiểu List<int>
-
Khi làm việc với các API phức tạp: Khai báo kiểu dữ liệu giúp bạn tránh các lỗi liên quan đến kiểu dữ liệu khi sử dụng các thư viện bên ngoài.
Tài nguyên học Dart
Nếu bạn mới bắt đầu với Dart, hãy tham khảo các tài nguyên sau:
Kết luận
Dart là một ngôn ngữ mạnh mẽ và dễ học, đặc biệt phù hợp để phát triển ứng dụng đa nền tảng với Flutter.
Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, hãy để lại bình luận bên dưới! Mình rất mong nhận được ý kiến từ các bạn để cải thiện bài viết này. 😊
Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về Dart và cách nó hoạt động. Hẹn gặp lại bạn trong các bài viết tiếp theo! 🚀
All rights reserved
Bình luận