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.








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




