Giới Thiệu
Trong quá trình phát triển ứng dụng Flutter, việc lựa chọn loại provider phù hợp từ 7 loại khác nhau của Riverpod có thể khiến nhiều lập trình viên băn khoăn. Đặc biệt là khi phải phân vân giữa các loại như NotifierProvider và StateNotifierProvider trong nhiều trường hợp. Điều này thường dẫn đến sự hoang mang vì mỗi loại provider được khuyên dùng cho các tình huống khác nhau.
Tuy nhiên, tác giả Remi Rousselet đã giới thiệu một phương pháp mới để sử dụng Riverpod với code generation, giúp giảm bớt gánh nặng cho các developer.
Cú Pháp Của Code Generation
Code generation trong Riverpod cho phép chúng ta khai báo các provider bằng cách sử dụng annotation @riverpod
. Hầu hết các đoạn code còn lại sẽ được tự động tạo ra nhờ vào công cụ build_runner
đã có sẵn trong Dart.
Cách Khai Báo Provider Mới
Trước đây, việc định nghĩa provider yêu cầu cú pháp phức tạp. Bây giờ, chúng ta chỉ cần viết như sau:
dart
@riverpod
Future<User> fetchUser(FetchUserRef ref, {required int userId}) async {
final json = await http.get('api/user/$userId');
return User.fromJson(json);
}
Thay vì phải ngồi suy nghĩ kỹ lưỡng để chọn một trong các loại provider, bạn có thể dễ dàng tham khảo bảng dưới đây để chọn cho mình loại provider phù hợp nhất cho từng use case:
|Functional (Không thể cập nhật bằng public methods)|Class-Based (Có thể cập nhật bằng public methods)|
|---|---|---|
|Sync|||
|Async - Future|||
|Async - Stream|||
Tính Năng KeepAlive
Theo cách viết mới này, mặc định mọi provider sẽ tự động bị xóa sau khi không còn listener nào theo dõi. Để giữ cho provider luôn tồn tại, chúng ta có thể sử dụng annotation như sau:
dart
@Riverpod(keepAlive: true)
Thêm Tham Số Cho Provider
Việc thêm tham số vào provider giờ đây trở nên đơn giản như thêm tham số cho hàm. Bạn có thể quàn tích thích hợp với cú pháp sau:
Với Functional Provider
dart
@riverpod
String example(
ExampleRef ref,
int param1, {
String param2 = 'foo',
}) {
return 'Hello $param1 & param2';
}
Với Class-Based Provider
dart
@riverpod
class Example extends _$Example {
@override
String build(
int param1, {
String param2 = 'foo',
}) {
return 'Hello $param1 & param2';
}
// Thêm các phương thức để thay đổi trạng thái
}
Ưu Điểm Của Code Generation
Việc chuyển từ cách làm cũ sang cách mới vẫn là tùy chọn, tuy nhiên, những ưu điểm sau sẽ giúp bạn dễ dàng quyết định:
- Cú pháp dễ đọc, dễ học và linh hoạt hơn.
- Giảm bớt nỗi lo trong việc lựa chọn provider phù hợp.
- Cú pháp đơn giản hơn, giống như một hàm hoặc lớp tùy chỉnh.
- Có thể truyền tham số không giới hạn, bao gồm tham số mặc định, tùy chọn hay có tên.
- Tính năng hot-reload để code có trạng thái.
- Nâng cao khả năng debug.
- Một số tính năng chỉ khả dụng khi sử dụng code generation.
Nhược Điểm Cần Lưu Ý
Tuy nhiên, khi áp dụng vào các dự án thực tế, một số nhược điểm cần xem xét:
- Code generation mới ra mắt gần đây vẫn còn ít ứng dụng thực tiễn, nên nguồn tài liệu tham khảo đa phần chỉ giới hạn trong tài liệu của Riverpod.
- Trong thời đại AI, nhiều công cụ tạo mã tự động vẫn áp dụng theo kiểu cũ, dẫn đến việc khó khăn trong việc tìm kiếm mã lệnh phù hợp. Dù sao, trên Android Studio đã có plugin Flutter Riverpod Snippets, giúp việc viết mã nhanh hơn.
Những nhược điểm này chỉ mang tính tạm thời. Khi code generation trở nên phổ biến hơn, những vấn đề này sẽ được khắc phục, vì vậy hãy yên tâm khi áp dụng phương pháp này vào dự án của bạn.
Tham Khảo
🔔 Blog: henrytechie.com
☕️ Facebook: Henry Techie
☁️ TikTok: @henrytechie
source: viblo