+1

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ụ

  1. 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 (namelatestVersion) 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.
  2. 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:

  1. 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
    
  2. 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>
    
  3. 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

Đang tải thêm bình luận...
Avatar
+1
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí