State Management trong Flutter là quá trình quản lý và thay đổi trạng thái của widget. Khi state thay đổi, widget sẽ được cập nhật lại để phản ánh thay đổi đó. Có nhiều phương pháp quản lý state trong Flutter, mỗi phương pháp phù hợp với các loại ứng dụng khác nhau.
Các phương pháp quản lý State trong Flutter:
-
setState()
setState() là phương pháp quản lý state cơ bản và đơn giản nhất trong Flutter. Nó chỉ có thể quản lý state cục bộ trong StatefulWidget. Khi setState() được gọi, Flutter sẽ tự động cập nhật lại giao diện người dùng để phản ánh sự thay đổi của state.-
Ứng dụng: Thích hợp cho các ứng dụng đơn giản, nơi mà state chỉ ảnh hưởng đến một widget duy nhất hoặc trong một phạm vi nhỏ.
-
Hạn chế: Khó mở rộng khi ứng dụng trở nên phức tạp với nhiều widget con cần chia sẻ state.
-
-
Provider
Provider là một trong những phương pháp quản lý state phổ biến trong Flutter, giúp chia sẻ dữ liệu giữa các widget mà không cần phải truyền dữ liệu qua constructor. Provider cho phép bạn quản lý state toàn cục (global state), giúp dễ dàng duy trì và chia sẻ state trong toàn bộ ứng dụng.-
Ứng dụng: Thích hợp cho các ứng dụng lớn và phức tạp, nơi cần phải quản lý state giữa nhiều widget hoặc khi có nhiều tầng trong ứng dụng.
-
Lợi ích: Cung cấp một cách tiếp cận rõ ràng, dễ hiểu để quản lý state và tách biệt logic kinh doanh khỏi giao diện người dùng.
-
Hạn chế: Có thể mất một chút thời gian để hiểu và cấu hình đúng cách.
-
-
Riverpod
Riverpod là một thư viện quản lý state mạnh mẽ hơn Provider. Nó có khả năng tự động làm mới các giá trị và cung cấp một cách dễ dàng để chia sẻ state toàn cục mà không phải lo về các vấn đề như context trong Provider.-
Ứng dụng: Thích hợp cho các ứng dụng có cấu trúc phức tạp hơn và cần một giải pháp linh hoạt hơn để quản lý state.
-
-
BLoC (Business Logic Component)
BLoC là một phương pháp quản lý state mạnh mẽ, dựa trên stream và sink. Mỗi thay đổi trong state sẽ được gửi qua stream và các widget sẽ nhận các thay đổi đó thông qua StreamBuilder.-
Ứng dụng: Thích hợp cho các ứng dụng lớn và phức tạp, đặc biệt khi cần tách biệt business logic khỏi giao diện người dùng.
-
Lợi ích: Đảm bảo rằng state luôn rõ ràng và dễ theo dõi, giúp ứng dụng dễ bảo trì và kiểm thử.
-
Hạn chế: Khó học và phức tạp hơn so với Provider hoặc setState().
-
-
Redux
Redux là một mô hình quản lý state dựa trên một store duy nhất và các action để thay đổi state. Khi có sự thay đổi, một action được gửi đi và một reducer sẽ cập nhật state.-
Ứng dụng: Thích hợp cho các ứng dụng lớn và phức tạp có yêu cầu rõ ràng về quản lý state toàn cục và các thay đổi cần phải được theo dõi cẩn thận.
-
Lợi ích: Quản lý state rất rõ ràng, dễ debug và kiểm thử.
-
Hạn chế: Có thể phức tạp và không cần thiết đối với ứng dụng nhỏ hoặc đơn giản.
-
-
GetX
GetX là một thư viện quản lý state nhẹ nhàng và hiệu quả. Nó cung cấp cách tiếp cận đơn giản và dễ sử dụng để quản lý state và routing trong ứng dụng.-
Ứng dụng: Thích hợp cho các ứng dụng cần quản lý state một cách nhanh chóng và hiệu quả mà không cần cấu hình phức tạp.
-
Lợi ích: Dễ dàng học và triển khai, ít boilerplate code.
-
Hạn chế: Không phù hợp với các ứng dụng quá phức tạp hoặc yêu cầu tính linh hoạt cao.
-
Tối ưu hiệu suất với State Management
Khi ứng dụng của bạn phát triển và có nhiều widget hoặc quản lý các trạng thái phức tạp, việc tối ưu hóa hiệu suất của state management là rất quan trọng. Một số kỹ thuật giúp cải thiện hiệu suất bao gồm:
a. Sử dụng Selector trong Provider
-
Selector giúp giảm thiểu việc rebuild không cần thiết bằng cách chỉ rebuild các widget liên quan đến phần state mà chúng thực sự quan tâm.
b. Kết hợp setState() và Provider
-
Bạn có thể kết hợp setState() với Provider để kiểm soát các phần nhỏ của widget mà không phải rebuild toàn bộ ứng dụng.
c. Tách biệt các phần của UI bằng StatefulWidget
-
Đảm bảo rằng mỗi phần của ứng dụng sử dụng các StatefulWidget riêng biệt, giúp giảm thiểu việc rebuild các phần không cần thiết khi state thay đổi.
d. Lazy Loading với Provider
-
Lazy loading giúp chỉ tải các phần của ứng dụng khi cần thiết, giúp giảm tải cho ứng dụng khi không có người dùng hoặc các phần của ứng dụng không cần thiết phải tái tạo lại.
Quản lý State Asynchronous (Bất đồng bộ)
Một phần quan trọng của State Management trong Flutter là quản lý các trạng thái bất đồng bộ, đặc biệt là khi làm việc với API hoặc các tác vụ dài hơi. Dưới đây là một số phương pháp để xử lý:
a. FutureBuilder và StreamBuilder
-
FutureBuilder và StreamBuilder giúp bạn dễ dàng xây dựng UI dựa trên các giá trị trả về từ các tác vụ bất đồng bộ như API call hoặc các stream dữ liệu.
b. BLoC và Provider với Streams
-
BLoC sử dụng Streams để quản lý các tác vụ bất đồng bộ, và Provider có thể kết hợp với StreamProvider để cập nhật giao diện dựa trên stream.
c. Using Redux with Async Actions (Middleware)
-
Sử dụng middleware trong Redux, như redux-thunk, để quản lý các actions bất đồng bộ. Điều này giúp bạn xử lý các tác vụ dài như gọi API trước khi dispatch các action cập nhật state.
Ứng dụng State Management vào Mini Project (Note App)
Mục tiêu sẽ làm trong bài này:
-
Nhập, lưu, hiển thị và xóa ghi chú (Sử dựng provider)
- Hiện message khi thêm hoặc xóa ghi chú (Sử dụng setState)
- Github Project : https://github.com/phuoc24205/intern-flutter-project
State Management:
-
StatefulWidget: Dùng để quản lý trạng thái ghi chú trong ứng dụng.
-
Provider: Có thể sử dụng để chia sẻ và quản lý danh sách ghi chú giữa các widget.
Trình bày ứng dụng State Management trong Project:
-
Sử dụng Global State với Provider để quản lí ghi chú (Thêm, xóa)
1. Tạo class NoteProvider (Có thêm note, xóa note)
Bọc ChangeNotifierProvider trong runApp
Khai báo provider và lấy list note từ provider trong build để sử dụng
Dùng noteProvider trong các button thêm và xóa
Thêm
Xóa
2. Sử dụng Local State để quản lí cập nhất message khi thêm hoặc xóa
Tạo biến trong _NoteHomeState và hàm showMessage trong showMessage dùng setState để cập nhật state
Thêm widget hiện thị thông báo
Sử dụng trong sự kiện press của button
Kết quả đặt được :