Dart Fundamentals

1. Dart

Dart là ngôn ngữ lập trình được phát triển bởi Google và là ngôn ngữ chính được sử dụng để xây dựng ứng dụng Flutter.

Dart được thiết kế để xây dựng:

  • Mobile App.
  • Web App.
  • Desktop App.
  • Backend.
  • Các ứng dụng có giao diện và hiệu năng cao.
  • Trong Flutter:
Dart
  ↓
Viết logic + UI
  ↓
Flutter Framework
  ↓
Ứng dụng Mobile / Web / Desktop

Có thể hiểu:

Flutter là Framework, còn Dart là ngôn ngữ lập trình mà Flutter sử dụng.

Ví dụ một chương trình Dart đơn giản:

void main() {
  print('Hello Dart');
}

main() là điểm bắt đầu của chương trình Dart.

2. Cấu trúc chương trình Dart cơ bản

Một chương trình Dart đơn giản:

void main() {
  print('Hello Flutter');
}

Trong đó:

void
→ Kiểu trả về của hàm

main()
→ Hàm entry point

print()
→ In dữ liệu ra console

Khi chương trình chạy:

main()
   ↓
print()
   ↓
Hello Flutter

3. Biến trong Dart

Biến dùng để lưu trữ dữ liệu trong chương trình.

Ví dụ:

String name = 'Tien';
int age = 21;
double height = 1.69;
bool isStudent = true;

Các kiểu dữ liệu cơ bản:

String
→ Chuỗi

int
→ Số nguyên

double
→ Số thực

bool
→ true / false

Ví dụ:

String name = 'Tien';
int age = 21;

print(name);
print(age);

4. var

var cho phép Dart tự suy luận kiểu dữ liệu dựa trên giá trị ban đầu.

Ví dụ:

var name = 'Tien';
var age = 21;
var height = 1.69;

Dart tự hiểu:

name
→ String

age
→ int

height
→ double

Sau khi Dart đã xác định kiểu, biến vẫn giữ kiểu đó.

var age = 21;

age = 22; // OK

Nhưng:

var age = 21;

age = 'Twenty One'; // Lỗi

vì age đã được suy luận là int.

5. dynamic

dynamic cho phép biến có thể chứa nhiều kiểu dữ liệu khác nhau.

dynamic value = 'Hello';

value = 100;
value = true;
value = 10.5;

Kiểu của value có thể thay đổi trong runtime.

Tuy nhiên, không nên lạm dụng dynamic vì làm giảm khả năng kiểm tra kiểu dữ liệu của Dart.

var
→ Dart suy luận kiểu và giữ kiểu đó

dynamic
→ Có thể thay đổi kiểu

6. final

final dùng cho biến chỉ được gán giá trị một lần.

final name = 'Tien';

name = 'Minh'; // Lỗi

Giá trị của final có thể được xác định trong runtime.

Ví dụ:

final currentTime = DateTime.now();

DateTime.now() chỉ được xác định khi chương trình chạy.

7. const

const dùng cho giá trị constant tại compile time.

const pi = 3.14159;
const appName = 'My App';

Ví dụ:

const number = 10;

Không thể thay đổi:

number = 20; // Lỗi

So sánh:

final
→ Không thể gán lại
→ Có thể xác định giá trị ở runtime

const
→ Constant tại compile time
→ Không thể thay đổi

Trong Flutter thường thấy:

const Text('Hello');

8. Null Safety

Dart có Null Safety, giúp hạn chế lỗi khi sử dụng giá trị null.

Ví dụ:

String name = 'Tien';

name không thể nhận null.

Nếu muốn cho phép null:

String? name;

Ký hiệu:

?
→ Cho phép null

Ví dụ:

String? username;

username = null;
username = 'Tien';

9. Null-aware Operators

Dart cung cấp nhiều toán tử để làm việc với null.

??

Trả về giá trị mặc định nếu biến là null.

String? name;

print(name ?? 'Unknown');

Kết quả:

Unknown

?.

Chỉ thực hiện thao tác nếu giá trị không phải null.

String? name;

print(name?.length);

Nếu name == null, biểu thức trả về null thay vì gây lỗi.

!

Khẳng định với Dart rằng giá trị chắc chắn không null.

String? name = 'Tien';

print(name!.length);

Cần cẩn thận với ! vì nếu giá trị thực sự là null, chương trình sẽ xảy ra lỗi runtime.

10. Operators

Dart hỗ trợ các toán tử cơ bản.

Arithmetic Operators

+
-
*
/
%

Ví dụ:

int a = 10;
int b = 3;

print(a + b);
print(a - b);
print(a * b);
print(a / b);
print(a % b);

Comparison Operators

==
!=
>
<
>=
<=

Ví dụ:

int age = 21;

print(age >= 18);

Kết quả:

true

Logical Operators

&&
||
!

Ví dụ:

bool isStudent = true;
bool isAdult = true;

print(isStudent && isAdult);

11. String

String dùng để biểu diễn chuỗi ký tự.

String name = 'Tien';

Dart hỗ trợ String interpolation:

int age = 21;

print('I am $age years old');

Có thể sử dụng biểu thức:

double price = 100;

print('Price: ${price * 2}');

12. Collection

Dart có ba collection quan trọng:

List
Set
Map

List

Danh sách có thứ tự.

List<String> names = [
  'Tien',
  'Minh',
  'Toan',
];

Truy cập:

print(names[0]);

Kết quả:

Tien

Thêm phần tử:

names.add('Nam');

Xóa:

names.remove('Nam');

Set

Set chứa các giá trị không trùng lặp.

Set<String> tags = {
  'Flutter',
  'Dart',
  'Flutter',
};

Kết quả chỉ có:

Flutter
Dart

Map

Map lưu dữ liệu dưới dạng:

key → value

Ví dụ:

Map<String, dynamic> user = {
  'name': 'Tien',
  'age': 21,
};

Truy cập:

print(user['name']);

Kết quả:

Tien

13. If Else

Dùng để thực hiện logic có điều kiện.

int age = 21;

if (age >= 18) {
  print('Adult');
} else {
  print('Minor');
}

Có thể có nhiều điều kiện:

if (score >= 8) {
  print('Good');
} else if (score >= 5) {
  print('Average');
} else {
  print('Bad');
}

14. Ternary Operator

Dùng khi cần biểu diễn điều kiện đơn giản.

int age = 21;

String result = age >= 18
    ? 'Adult'
    : 'Minor';

Cấu trúc:

condition ? valueIfTrue : valueIfFalse

15. Switch

switch dùng khi cần kiểm tra một giá trị với nhiều trường hợp.

String role = 'admin';

switch (role) {
  case 'admin':
    print('Administrator');
    break;

  case 'user':
    print('User');
    break;

  default:
    print('Unknown');
}

Trong Dart hiện đại, switch còn hỗ trợ pattern matching và expression.

16. Vòng lặp

for

for (int i = 0; i < 5; i++) {
  print(i);
}

for-in

Thường dùng để duyệt Collection.

List<String> names = [
  'Tien',
  'Minh',
  'Toan',
];

for (final name in names) {
  print(name);
}

while

int i = 0;

while (i < 5) {
  print(i);
  i++;
}

17. Function

Function là một khối code thực hiện một nhiệm vụ cụ thể.

Ví dụ:

int add(int a, int b) {
  return a + b;
}

Gọi:

int result = add(10, 20);

print(result);

Kết quả:

30

18. Arrow Function

Nếu Function chỉ có một biểu thức, có thể viết ngắn bằng =>.

int add(int a, int b) => a + b;

Ví dụ:

bool isAdult(int age) => age >= 18;

Tương đương:

bool isAdult(int age) {
  return age >= 18;
}

19. Optional Parameters

Dart hỗ trợ optional parameters.

Optional positional parameter

String greet(String name, [String? message]) {
  return '$name: ${message ?? 'Hello'}';
}

Có thể gọi:

greet('Tien');

hoặc:

greet('Tien', 'Welcome');

Named parameters

Đây là kiểu được sử dụng rất nhiều trong Flutter.

void createUser({
  required String name,
  int age = 18,
}) {
  print(name);
  print(age);
}

Gọi:

createUser(
  name: 'Tien',
  age: 21,
);

Trong Flutter:

Text(
  'Hello',
  style: TextStyle(
    fontSize: 20,
  ),
)

Các tham số như style, fontSize thường được truyền dưới dạng named parameter.

20. Class

Class là khuôn mẫu để tạo Object.

Ví dụ:

class User {
  String name;
  int age;

  User({
    required this.name,
    required this.age,
  });

  void introduce() {
    print('I am $name');
  }
}

Tạo Object:

final user = User(
  name: 'Tien',
  age: 21,
);

Gọi method:

user.introduce();

21. Constructor

Constructor dùng để khởi tạo Object.

Ví dụ:

class Product {
  String name;
  double price;

  Product({
    required this.name,
    required this.price,
  });
}

Tạo Object:

final product = Product(
  name: 'Nike',
  price: 2500000,
);

Flutter sử dụng Constructor rất nhiều:

const Text(
  'Hello',
)

Ở đây Text() là constructor của Widget Text.

22. Named Constructor

Dart cho phép tạo nhiều Constructor với tên khác nhau.

class User {
  String name;

  User(this.name);

  User.guest() : name = 'Guest';
}

Sử dụng:

final user1 = User('Tien');

final user2 = User.guest();

23. Inheritance

Dart hỗ trợ kế thừa thông qua extends.

class Animal {
  void eat() {
    print('Eating');
  }
}

class Dog extends Animal {
  void bark() {
    print('Bark');
  }
}

Dog có thể sử dụng:

final dog = Dog();

dog.eat();
dog.bark();

Trong Flutter:

class HomePage extends StatelessWidget {
  ...
}

HomePage kế thừa từ StatelessWidget.

24. Abstract Class

abstract class dùng để định nghĩa một lớp cơ sở mà thường không tạo Object trực tiếp.

abstract class Animal {
  void sound();
}

Class con triển khai:

class Dog extends Animal {
  @override
  void sound() {
    print('Bark');
  }
}

25. Interface

Trong Dart, mọi class đều có thể được sử dụng như một interface.

Có thể sử dụng implements:

class Animal {
  void sound() {}
}

class Dog implements Animal {
  @override
  void sound() {
    print('Bark');
  }
}

Khi implements, class phải triển khai các thành viên cần thiết của interface.

26. Mixin

mixin cho phép tái sử dụng một nhóm chức năng giữa nhiều class mà không cần kế thừa trực tiếp.

mixin Logger {
  void log(String message) {
    print(message);
  }
}

Sử dụng:

class UserService with Logger {
  void login() {
    log('User logged in');
  }
}

Dart sử dụng mixin khá nhiều trong các kiến trúc phức tạp.

27. Enum

enum dùng để định nghĩa một tập hợp các giá trị cố định.

enum OrderStatus {
  pending,
  shipping,
  completed,
  cancelled,
}

Sử dụng:

OrderStatus status = OrderStatus.pending;

Rất phù hợp cho:

OrderStatus
PaymentStatus
UserRole
ThemeMode
LoadingStatus

28. Exception Handling

Dart sử dụng try-catch để xử lý Exception.

try {
  int result = 10 ~/ 0;
  print(result);
} catch (e) {
  print('Error: $e');
}

Có thể sử dụng:

try {
  ...
} catch (e) {
  ...
} finally {
  ...
}

finally luôn được thực hiện sau quá trình xử lý.

29. Async Programming

Dart hỗ trợ lập trình bất đồng bộ thông qua:

Future
async
await
Stream

Future

Future đại diện cho một kết quả sẽ có trong tương lai.

Ví dụ:

Future<String> fetchUser() async {
  return 'Tien';
}

async / await

Future<void> loadData() async {
  final user = await fetchUser();

  print(user);
}

Quá trình:

loadData()
    ↓
await fetchUser()
    ↓
Chờ dữ liệu
    ↓
Nhận kết quả
    ↓
Tiếp tục chương trình

Async là kiến thức rất quan trọng khi làm Flutter vì ứng dụng thường xuyên cần:

• Gọi API.

• Đọc Database.

• Đọc File.

• Authentication.

• Upload dữ liệu.

30. Stream

Stream dùng để xử lý một chuỗi dữ liệu được phát ra theo thời gian.

Ví dụ:

Stream<int> counter() async* {
  for (int i = 0; i < 5; i++) {
    yield i;
  }
}

Có thể lắng nghe:

counter().listen((value) {
  print(value);
});

Stream thường được sử dụng cho:

Realtime data
WebSocket
Firebase
Database changes
User events

31. Futures và Streams

Có thể nhớ:

Future
→ Một kết quả trong tương lai

Stream
→ Nhiều kết quả theo thời gian

Ví dụ:

Future
API request
→ trả về một response

Stream
Chat
→ message 1
→ message 2
→ message 3
→ message 4

32. Extension Methods

Dart cho phép thêm chức năng vào một class mà không cần sửa class gốc.

Ví dụ:

extension StringExtension on String {
  bool get isEmail {
    return contains('@');
  }
}

Sử dụng:

print('[email protected]'.isEmail);

Extension rất hữu ích để tạo các utility function.

33. Generics

Generics cho phép class hoặc function làm việc với nhiều kiểu dữ liệu nhưng vẫn đảm bảo type safety.

Ví dụ:

List<String> names = [];

List<int> numbers = [];

Ở đây:

List<String>
→ List chứa String

List<int>
→ List chứa int

Có thể tạo Generic Class:

class Box<T> {
  T value;

  Box(this.value);
}

Sử dụng:

final box1 = Box<String>('Hello');

final box2 = Box<int>(100);

34. Type Inference

Dart có khả năng tự suy luận kiểu dữ liệu.

var name = 'Tien';

Dart hiểu:

name → String

Hoặc:

var numbers = [1, 2, 3];

Dart hiểu:

numbers → List<int>

Điều này giúp code ngắn gọn nhưng vẫn giữ được Type Safety.

35. Type Safety

Dart là ngôn ngữ type-safe.

Ví dụ:

int age = 21;

Không thể:

age = 'Twenty One';

Điều này giúp phát hiện nhiều lỗi ngay trong quá trình development thay vì chờ đến runtime.

36. Cascade Notation

Dart có Cascade Notation .. và ?.. để thực hiện nhiều thao tác trên cùng một Object.

Ví dụ:

final user = User(
  name: 'Tien',
  age: 21,
)
  ..name = 'Minh'
  ..age = 22;

Thay vì:

final user = User(
  name: 'Tien',
  age: 21,
);

user.name = 'Minh';
user.age = 22;

Cascade thường hữu ích khi cấu hình Object.

37. Import

Dart sử dụng import để sử dụng code từ file hoặc package khác.

Ví dụ:

import 'package:flutter/material.dart';

Đây là import rất phổ biến trong Flutter.

Import file riêng:

import 'models/user.dart';

38. Package

Dart có hệ thống Package để sử dụng thư viện bên ngoài.

Ví dụ Flutter project có:

dependencies:
  flutter:
    sdk: flutter

Có thể thêm package:

dependencies:
  http: ^1.0.0

Sau đó import:

import 'package:http/http.dart';

Các package giúp mở rộng chức năng mà không cần tự xây dựng mọi thứ từ đầu.

39. Dart và Flutter liên hệ với nhau như thế nào?

Có thể hình dung:

Dart
│
├── Variables
├── Functions
├── Classes
├── OOP
├── Collections
├── Null Safety
├── Async / Await
├── Future / Stream
└── Generics
        ↓
     Flutter
        ↓
   Widgets
        ↓
   Application

Flutter sử dụng Dart để:

• Xây dựng Widget.

• Xử lý State.

• Gọi API.

• Xử lý dữ liệu.

• Làm việc với Database.

• Viết Business Logic.

• Xử lý Async.

40. Những kiến thức Dart cần nắm trước khi học Flutter sâu

Có thể chia thành các nhóm:

Cơ bản

Variables
Data Types
var
final
const
Operators
String
Null Safety

Control Flow

if / else
switch
for
for-in
while

Function

Function
Parameters
Return Type
Optional Parameters
Named Parameters
Arrow Function

Collection

List
Set
Map
Collection Methods

OOP

Class
Object
Constructor
Inheritance
Abstract Class
Interface
Mixin
Enum

Async

Future
async
await
Stream
Exception Handling

Dart nâng cao

Generics
Extension
Cascade
Pattern Matching
Records
Typedef
Isolate

41. Tóm tắt

Dart Fundamentals là nhóm kiến thức nền tảng cần nắm trước khi học Flutter chuyên sâu.

Có thể ghi nhớ theo sơ đồ:

Dart Fundamentals
│
├── Variables & Data Types
│   ├── int
│   ├── double
│   ├── String
│   ├── bool
│   ├── var
│   ├── final
│   └── const
│
├── Null Safety
│   ├── ?
│   ├── ??
│   ├── ?.
│   └── !
│
├── Control Flow
│   ├── if / else
│   ├── switch
│   └── loops
│
├── Functions
│   ├── Parameters
│   ├── Named Parameters
│   ├── Optional Parameters
│   └── Arrow Function
│
├── Collections
│   ├── List
│   ├── Set
│   └── Map
│
├── OOP
│   ├── Class
│   ├── Object
│   ├── Constructor
│   ├── Inheritance
│   ├── Abstract
│   ├── Interface
│   └── Mixin
│
├── Async
│   ├── Future
│   ├── async
│   ├── await
│   └── Stream
│
└── Advanced
    ├── Generics
    ├── Extension
    ├── Cascade
    ├── Records
    └── Isolate

Cốt lõi cần nhớ

Dart là ngôn ngữ lập trình đứng phía dưới Flutter. Muốn học Flutter tốt cần nắm chắc Dart Fundamentals, đặc biệt là Variables, Functions, Collections, OOP, Null Safety và Async Programming.

Flutter cung cấp Widget và Framework để xây dựng ứng dụng, còn Dart cung cấp ngôn ngữ để xử lý dữ liệu, logic, State, API, Database và các nghiệp vụ phía sau giao diện.

Bài viết khác

Language Switching trong Flutter

        Trong quá trình phát triển ứng dụng di động, khả năng hỗ trợ nhiều ngôn ngữ ngày càng trở nên quan trọng. Một ứng dụng chỉ sử dụng duy nhất một ngôn ngữ có thể gặp khó khăn khi tiếp cận người dùng ở các quốc gia và khu vực khác […]

UTC & Local Time Conversion

Trong thời đại toàn cầu hóa, con người thường xuyên làm việc, học tập và giao tiếp với những người ở các quốc gia khác nhau. Một cuộc họp trực tuyến có thể được tổ chức tại Việt Nam, nhưng người tham gia lại đang ở Hoa Kỳ, Anh, Nhật Bản hoặc Australia. Vì vậy, […]

Logging / Monitoring / CI/CD

1. Logging / Monitoring / CI/CD là gì? Trong quá trình phát triển phần mềm, việc viết code để ứng dụng chạy được chỉ là một phần của công việc. Khi đưa ứng dụng vào sử dụng thực tế, lập trình viên còn phải quan tâm đến nhiều vấn đề khác như ứng dụng có […]

Docker

1. Docker là gì? Docker là một nền tảng được sử dụng để đóng gói, triển khai và chạy ứng dụng trong các môi trường độc lập, được gọi là Container. Docker giúp lập trình viên đưa mã nguồn, thư viện, các gói phụ thuộc và những thành phần cần thiết để chạy ứng dụng […]

Unit Testing và Integration Testing

1. Unit Testing và Integration Testing là gì? Unit Testing và Integration Testing là hai phương pháp kiểm thử phần mềm thường được sử dụng trong quá trình phát triển ứng dụng. Mục đích của hai phương pháp này là kiểm tra xem chương trình có hoạt động đúng theo yêu cầu hay không, đồng […]

Message Broker

1. Message Broker là gì? Message Broker là một thành phần trung gian được sử dụng để tiếp nhận, quản lý và chuyển tiếp thông điệp giữa các ứng dụng hoặc các thành phần trong một hệ thống phần mềm. Công nghệ này thường xuất hiện trong những hệ thống Backend, kiến trúc Microservices và […]

Leave a Reply

Your email address will not be published. Required fields are marked *