# Flutter Summary
## 1. Những kiến thức đã tiếp thu
### a. Flutter SDK
- SDK để xây dựng User Interface cho ứng dụng Web, ứng dụng trên Windows cũng như ứng dụng trên thiết bị di động chỉ với 1 codebase.
- Dart - ngôn ngữ lập trình hướng đối tượng sử dụng trong Flutter SDK có cấu trúc tương đối giống với Java.
- pubspec.yaml: Là một file luôn xuất hiện trong Flutter project, với vai trò là chứa metadata về project để Dart và Flutter có thể sử dụng, bao gồm:
- Dependencies cần thiết trong project.
- Định danh các asset cần thiết.
- Dependencies để lập trình (có thể vụ testing).
- Các ràng buộc về phiên bản của Flutter SDK.
### b. Widget Tree - Element Tree - Render Tree
- Widget Tree: Widget đang sử dụng, có nghĩa là source code tạo nên Widget Tree.
- Element Tree: Với mỗi widget -> element tương ứng lưu trữ các thông tin của widget để render tree thực hiện hiển thị lên màn hình.
- Render Tree: instance của các element/object sẽ hiển thị trên màn hình ứng dụng.
### c. Widget
- MaterialApp: Là một widget tập hợp gồm rất nhiều widget cần thiết cho một ứng dụng được gọi là Material Design - một hế thống design được xây dựng bởi Google bao gồm những hướng dẫn chuyên sâu về UX cũng như hướng dẫn sử dụng những component được thiết kế bởi Google để xây dựng ứng dụng trên Android, Flutter và Web.
- Scaffold: Widget với một số chức năng cơ bản như **AppBar**, **FloatingButton**, BottomNagivationBar, etc.
- Một số widget được sử dụng phổ biến có thể bao gồm:
- Các view cơ bản: ListView, GridView, CustomScrollView, etc.
- Container
- Stack
- Row / Column / Expanded
- Text, RichText
- TextField
- Padding
- etc.
- Bên cạnh đó, còn một số Widget phổ biến khác được giới thiệu trên [Flutter Widget of the Week](https://youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG)
### d. State Management
- Emphemeral state
- State nhưng có thể tồn tại trong một Widget và không cần phải share state nó ra bên ngoài.
- Tiêu biểu chính là việc sử dụng Stateful Widget mà không cần phải sử dụng đến State management.
- App state
- State nhưng người dùng muốn nó nằm trên toàn bộ ứng dụng, trong suốt quá trình sử dụng ứng dụng.
- Có thể kể đến như login info, cart, etc.
- Thường app state sẽ sử dụng state management, một số cách có thể kể đến như:
- Provider
- setState
- Bloc
- GetIt
- etc.
#### Stateless Widget
- Widget nhưng bản thân nó không có state.
- Nó chỉ render dữ liệu một lần sau khi gọi build() và nó không tự update chính bản thân nó, và chúng chỉ update khi có dữ liệu từ bên ngoài gửi đến.
- Text(), Icon(), IconButton().widget.
#### Stateful Widget
- Widget nhưng có state (**internal state** hay **ephemeral state**).
- Trong suốt vòng đời của nó, nó có thể gọi hàm *build()* nhiều lần.
- Thay đổi dựa trên sự thay đổi của dữ liệu hay từ input người dùng.
- TextField(), CheckBox(), Form(), RadioButton(), etc.
### e. Một số thư viện / nội dung tham khảo đã sử dụng
- Dio: HTTP client for Flutter, API để thực hiện các HTTP request.
- Provider: package để quản lý app state trở nên dễ dàng và hiệu quả.
- Hive: Một cơ sở dữ liệu sử dụng key-value để lưu trữ dữ liệu local.
- Flutter Awesome: [Flutter Awesome Github](https://github.com/Solido/awesome-flutter) - nơi chứa rất nhiều custom component cũng như các nội dung, bài viết liên quan đến phát triển ứng dụng sử dụng Flutter.
- cached_network_image: thư viện để hiển thị ảnh thông qua URL.
### f. json file
- Đọc/ghi dữ liệu trên local json file.
- Xuất Model từ dữ liệu json cho trước.
## 2. Những vấn đề cần cải thiện
- Cần tìm hiểu những cách thức custom lại một số Widget của Flutter để phù hợp với nhu cầu sử dụng của bản thân.
- Cần tìm hiểu cách để áp dụng một số những Design Patterns phổ biến để giúp cho việc code trở nên gọn gàng và hiệu quả hơn.
- Còn một số chủ đề cần tìm hiểu bao gồm BLoc-Provider, Networking, Firebase, cũng như tìm kiếm thêm một số thư viện để hỗ trợ trong quá trình develop mobile application.