
🚀 Cơ bản về Flutter & Dart
## Làm quen với ngôn ngữ Dart dành cho lập trình Flutter

## Mục lục
1. [Giới thiệu](#giới-thiệu)
2. [Ngôn ngữ Dart - Nền tảng của Flutter](#ngôn-ngữ-dart---nền-tảng-của-flutter)
3. [Cấu trúc cơ bản trong Dart](#cấu-trúc-cơ-bản-trong-dart)
4. [Flutter Widgets - Xây dựng UI](#flutter-widgets---xây-dựng-ui)
5. [Xây dựng ứng dụng đầu tiên](#xây-dựng-ứng-dụng-đầu-tiên)
6. [Các tips và thực hành tốt nhất](#các-tips-và-thực-hành-tốt-nhất)
7. [Kết luận](#kết-luận)
## Giới thiệu
Flutter là framework phát triển ứng dụng di động đa nền tảng do Google phát triển, cho phép lập trình viên tạo ra các ứng dụng đẹp, nhanh và hoạt động trên nhiều nền tảng (iOS, Android, Web, Desktop) từ cùng một codebase. Trung tâm của Flutter là ngôn ngữ lập trình Dart, cũng được phát triển bởi Google.
Bài viết này sẽ giới thiệu cơ bản về Dart và Flutter, giúp bạn có cái nhìn tổng quan về cách phát triển ứng dụng với công nghệ hiện đại này.
## Ngôn ngữ Dart - Nền tảng của Flutter
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ế để dễ học, đặc biệt là đối với các lập trình viên đã quen thuộc với C#, Java hoặc JavaScript.
### Những đặc điểm chính của Dart:
1. **Strongly typed**: Dart là ngôn ngữ được định kiểu mạnh, giúp phát hiện lỗi sớm trong quá trình phát triển.
2. **Null safety**: Từ Dart 2.12, ngôn ngữ này hỗ trợ null safety, giúp tránh các lỗi liên quan đến null reference.
3. **Async/await**: Dart cung cấp cú pháp async/await để xử lý bất đồng bộ một cách dễ dàng.
4. **JIT và AOT compilation**: Dart hỗ trợ cả Just-In-Time (JIT) để phát triển nhanh và Ahead-Of-Time (AOT) để triển khai hiệu quả.
### Cú pháp cơ bản trong Dart:
```dart
// Biến và kiểu dữ liệu
String name = 'Flutter';
int age = 5;
double version = 3.10;
bool isAwesome = true;
var dynamicType = 'Tự động xác định kiểu';
// Danh sách và Collections
List<String> frameworks = ['Flutter', 'React Native', 'Xamarin'];
Map<String, String> languageCreators = {
'Dart': 'Google',
'Swift': 'Apple',
'Kotlin': 'JetBrains'
};
// Hàm
int add(int a, int b) {
return a + b;
}
// Arrow function (Lambda)
int subtract(int a, int b) => a - b;
// Lớp và đối tượng
class Person {
String name;
int age;
// Constructor
Person(this.name, this.age);
// Method
void introduce() {
print('Xin chào, tôi là $name và tôi $age tuổi.');
}
}
// Sử dụng async/await
Future<void> fetchData() async {
try {
var result = await getDataFromServer();
print(result);
} catch (e) {
print('Lỗi: $e');
}
}
```
## Cấu trúc cơ bản trong Dart
### 1. Biến và kiểu dữ liệu
Dart có các kiểu dữ liệu cơ bản như:
- `int`: Số nguyên
- `double`: Số thực
- `String`: Chuỗi
- `bool`: Boolean (true/false)
- `List`: Danh sách
- `Set`: Tập hợp
- `Map`: Từ điển (key-value)
Khi khai báo biến, bạn có thể chỉ định kiểu rõ ràng hoặc sử dụng từ khóa `var` để Dart tự suy luận kiểu:
```dart
// Chỉ định kiểu rõ ràng
String name = 'Nguyen Van A';
// Tự suy luận kiểu
var age = 30; // age sẽ có kiểu int
```
Với Null Safety, bạn cần sử dụng dấu `?` để chỉ định rằng một biến có thể nhận giá trị null:
```dart
String? nullableName; // Có thể null
String nonNullableName = 'Flutter'; // Không thể null
```
### 2. Hàm và phương thức
Cú pháp định nghĩa hàm trong Dart:
```dart
// Hàm cơ bản
int sum(int a, int b) {
return a + b;
}
// Arrow function
int multiply(int a, int b) => a * b;
// Tham số tùy chọn
void greet(String name, {String greeting = 'Xin chào'}) {
print('$greeting, $name!');
}
// Gọi hàm với tham số tùy chọn
greet('Flutter'); // Output: Xin chào, Flutter!
greet('Dart', greeting: 'Chào mừng'); // Output: Chào mừng, Dart!
```
### 3. Lớp và đối tượng
Dart là ngôn ngữ hướng đối tượng, hỗ trợ đầy đủ các tính năng như kế thừa, đa hình, trừu tượng và đóng gói:
```dart
// Định nghĩa lớp
class Developer {
String name;
List<String> skills;
// Constructor
Developer(this.name, this.skills);
// Named constructor
Developer.junior(String name) : this(name, ['Dart', 'Flutter']);
// Method
void introduce() {
print('Tôi là $name và tôi biết: ${skills.join(', ')}');
}
}
// Kế thừa
class SeniorDeveloper extends Developer {
int experienceYears;
SeniorDeveloper(String name, List<String> skills, this.experienceYears)
: super(name, skills);
// Ghi đè phương thức
@override
void introduce() {
print('Senior Dev $name với $experienceYears năm kinh nghiệm.');
print('Kỹ năng: ${skills.join(', ')}');
}
}
// Sử dụng
var dev = Developer('An', ['Flutter', 'Firebase']);
dev.introduce();
var senior = SeniorDeveloper('Binh', ['Flutter', 'Dart', 'Firebase', 'AWS'], 5);
senior.introduce();
```
## Flutter Widgets - Xây dựng UI

Flutter sử dụng một paradigm gọi là "Everything is a Widget". Tất cả UI trong Flutter được xây dựng bằng cách kết hợp các widget lại với nhau.
### Các loại widget chính:
1. **Stateless Widgets**: Widgets không có trạng thái, không thay đổi sau khi được xây dựng.
```dart
class WelcomeCard extends StatelessWidget {
final String name;
const WelcomeCard({Key? key, required this.name}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text('Chào mừng, $name!'),
),
);
}
}
```
2. **Stateful Widgets**: Widgets có trạng thái nội bộ, có thể thay đổi trong vòng đời của widget.
```dart
class Counter extends StatefulWidget {
const Counter({Key? key}) : super(key: key);
@override
_CounterState createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int _count = 0;
void _increment() {
setState(() {
_count++;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Số lần nhấn: $_count'),
ElevatedButton(
onPressed: _increment,
child: Text('Tăng'),
),
],
);
}
}
```
### Các widget thông dụng:
- **Container**: Widget đa năng cho phép tùy chỉnh kích thước, padding, margin và trang trí.
- **Row, Column**: Sắp xếp các widget con theo chiều ngang hoặc dọc.
- **Stack**: Xếp chồng các widget lên nhau.
- **ListView**: Hiển thị danh sách các widget có thể cuộn.
- **GridView**: Hiển thị lưới các widget.
- **Text**: Hiển thị văn bản có thể tùy chỉnh.
- **Image**: Hiển thị hình ảnh.
- **Button**: Các loại nút như ElevatedButton, TextButton, OutlinedButton.
### Ví dụ về bố cục UI:
```dart
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Ứng dụng Flutter'),
),
body: Column(
children: [
// Header section
Container(
color: Colors.blue[100],
padding: EdgeInsets.all(16.0),
child: Row(
children: [
CircleAvatar(
radius: 30,
backgroundImage: AssetImage('assets/avatar.png'),
),
SizedBox(width: 16),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Nguyen Van A',
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
Text('Flutter Developer'),
],
),
],
),
),
// Content section
Expanded(
child: ListView.builder(
itemCount: 20,
itemBuilder: (context, index) {
return ListTile(
leading: Icon(Icons.article),
title: Text('Bài viết ${index + 1}'),
subtitle: Text('Mô tả ngắn về bài viết'),
onTap: () {
// Xử lý khi nhấn vào item
},
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// Xử lý khi nhấn nút
},
child: Icon(Icons.add),
),
);
}
```
## Xây dựng ứng dụng đầu tiên

Để tạo một ứng dụng Flutter đơn giản, hãy thực hiện các bước sau:
### 1. Cài đặt Flutter SDK
```bash
# Tải và cài đặt Flutter SDK từ https://flutter.dev/docs/get-started/install
# Sau khi cài đặt, kiểm tra cài đặt
flutter doctor
```
### 2. Tạo dự án mới
```bash
flutter create my_first_app
cd my_first_app
```
### 3. Cấu trúc dự án Flutter
```
my_first_app/
├── android/ # Mã nguồn Android
├── ios/ # Mã nguồn iOS
├── lib/ # Mã nguồn Dart
│ └── main.dart # File chính của ứng dụng
├── test/ # Thư mục kiểm thử
├── pubspec.yaml # Khai báo dependencies
└── README.md
```
### 4. File main.dart cơ bản
```dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ứng dụng đầu tiên',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Trang chủ Flutter'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Bạn đã nhấn nút:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Tăng',
child: Icon(Icons.add),
),
);
}
}
```
### 5. Chạy ứng dụng
```bash
flutter run
```
## Các tips và thực hành tốt nhất
1. **State Management**: Sử dụng các giải pháp quản lý trạng thái như Provider, Riverpod, Bloc, GetX để quản lý trạng thái ứng dụng một cách hiệu quả.
2. **Cấu trúc dự án**: Tổ chức mã nguồn theo các lớp logic như:
- `lib/models/`: Các model dữ liệu
- `lib/screens/`: Các màn hình UI
- `lib/widgets/`: Các widget tái sử dụng
- `lib/services/`: Các dịch vụ (API, database, authentication)
- `lib/utils/`: Các hàm tiện ích
3. **Tách biệt UI và Logic**: Sử dụng các mẫu thiết kế như MVVM, Repository để tách biệt UI và business logic.
4. **Responsive UI**: Sử dụng MediaQuery, LayoutBuilder để xây dựng UI thích ứng với nhiều kích thước màn hình.
5. **Code style**: Tuân thủ quy tắc đặt tên và cấu trúc mã nguồn của Dart.
```dart
// Sử dụng camelCase cho biến và hàm
String userName;
void fetchUserData() { ... }
// Sử dụng PascalCase cho lớp
class UserRepository { ... }
// Sử dụng lowerCamelCase cho tham số hàm
void updateUser({required String firstName, String? lastName}) { ... }
```
6. **Optimization**: Sử dụng `const` constructor khi có thể để tối ưu hiệu suất rebuild.
```dart
// Thay vì
Container(
color: Colors.blue,
child: Text('Hello'),
)
// Sử dụng const
const Container(
color: Colors.blue,
child: Text('Hello'),
)
```
## Kết luận
Dart và Flutter cung cấp một cách tiếp cận hiện đại và hiệu quả để phát triển ứng dụng đa nền tảng. Với cú pháp rõ ràng của Dart và hệ thống widget mạnh mẽ của Flutter, bạn có thể tạo ra các ứng dụng đẹp, nhanh và có thể chạy trên nhiều nền tảng từ cùng một codebase.
Đây chỉ là những kiến thức cơ bản để bắt đầu với Flutter và Dart. Để trở thành một nhà phát triển Flutter chuyên nghiệp, bạn cần thực hành và khám phá thêm nhiều tính năng nâng cao như:
- Animation và Transitions
- Navigation và Routing
- Internationalization
- Testing
- Firebase integration
- Custom Widgets và Platform Channels
Hãy bắt đầu hành trình khám phá Flutter và Dart ngay hôm nay!
flutter
dart
cơ bản
mobile
Chia sẻ:
Bài viết liên quan
Cách chạy Flutter trên Android/iOS/Web
Cách chạy Flutter trên Android/iOS/Web  Giới thiệu Flutter là một framework phá...
Flutter - Framework Phát Triển Ứng Dụng Đa Nền Tảng
Các ứng dụng thành công được xây dựng bằng Flutter  Flutter đã trở thành một trong những framework ph...
Các Công Cụ Hỗ Trợ Phát Triển UI Mạnh Mẽ Trong Flutter
Các Công Cụ Hỗ Trợ Phát Triển UI Mạnh Mẽ Trong Flutter  Flutter đã nổi lên như một framework ...