Quay lại danh sách bài viết

🚀 Cơ bản về Flutter & Dart

15 tháng 05, 2024
admin
🚀 Cơ bản về Flutter & Dart
🚀 Cơ bản về Flutter & Dart ## Làm quen với ngôn ngữ Dart dành cho lập trình Flutter ![Flutter và Dart - Công nghệ phát triển ứng dụng đa nền tảng](./assets/flutter-intro.jpg) ## 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 Widgets - Xây dựng giao diện người dùng](./assets/flutter-ui-widgets.jpg) 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 ![Ứng dụng di động Flutter](./assets/flutter-app.jpg) Để 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 ![Flutter trên các nền tảng](/img/blog/flutter_platforms.svg) 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 Apps](/img/blog/flutter-apps.svg) 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 UI Tools](/img/blog/flutter-ui-tools.jpg) Flutter đã nổi lên như một framework ...