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:

  1. 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.

  2. 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.

  3. 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.

  4. 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().

  5. 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.

  6. 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

  • FutureBuilderStreamBuilder 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:

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:

  1. 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 :

 

 

About the Author

Tấn Phước

View all author's posts

Leave a Comment

Your email address will not be published. Required fields are marked *

Bài viết khác

Kanban

1. Kanban là gì? Kanban là một phương pháp quản lý công việc trực quan, giúp bạn theo dõi tiến độ từng nhiệm vụ. Kanban bắt nguồn từ Nhật Bản, ban đầu được Toyota dùng để quản lý dây chuyền sản xuất, nhưng ngày nay được áp dụng rộng rãi trong các lĩnh vực như […]

Scum

1. Scrum là gì? Scrum là một khung làm việc (framework) giúp các nhóm làm việc cùng nhau để phát triển sản phẩm một cách linh hoạt và hiệu quả. Nó thuộc phương pháp Agile – đề cao sự thích nghi, cộng tác và cải tiến liên tục trong quá trình làm việc. 2. Các […]

So sánh Realm, Hive, Sqflite, và Drift

So sánh Tiêu chí Realm Hive Sqflite Drift Mức độ phổ biến Tăng nhanh (Meta hỗ trợ) Rất phổ biến Rất phổ biến Trung bình (cộng đồng ổn định) Dễ sử dụng, dễ tích hợp Trung bình (cần setup Realm SDK) ★ Rất dễ (NoSQL, không cần SQL) Trung bình (phải viết SQL tay) Trung […]

Testing

I. Testing là gì? Testing (kiểm thử phần mềm) là quá trình đánh giá một hệ thống phần mềm để xác định xem sản phẩm có đáp ứng các yêu cầu được đặt ra hay không, và nhằm phát hiện lỗi nếu có. Testing là một phần quan trọng trong vòng đời phát triển phần […]

Application security

Ứng dụng bảo mật là gì? Application Security (Bảo mật ứng dụng) là quá trình bảo vệ ứng dụng khỏi các lỗ hổng và tấn công từ các mối đe dọa bên ngoài. Quá trình này bao gồm các biện pháp bảo vệ trong suốt vòng đời phát triển phần mềm (SDLC): từ thiết kế, […]

MVC/MVP

1. Giới thiệu chung Trong phát triển phần mềm, việc tổ chức mã theo mô hình kiến trúc rõ ràng là rất quan trọng để dễ dàng bảo trì, mở rộng và kiểm thử. Hai mô hình phổ biến trong phát triển ứng dụng là: MVC (Model – View – Controller) MVP (Model – View […]