Tích hợp Flutter với quyền sở hữu container rõ ràng.
ProviderScope có thể sở hữu một container hoặc nhận một container từ bên ngoài. Các API Consumer giữ cho việc truy cập WidgetRef tương thích với mã theo phong cách Riverpod.
Quyền sở hữu ProviderScope
Quyền sở hữu container thay đổi trách nhiệm dispose.
Container nội bộ
ProviderScope(child: ...) sẽ tự động dispose
Container bên ngoài
ProviderScope(container: c, ...) yêu cầu người gọi gọi c.dispose()
Scope không được kiểm soát
UncontrolledProviderScope không bao giờ dispose container
Lỗi thường gặp
Trong widget test, hãy nhớ dispose ProviderContainer được tiêm từ bên ngoài để tránh rò rỉ timer đang chờ.
Các biến thể Consumer
Tất cả lựa chọn đều hiển thị WidgetRef; hãy chọn theo kiểu widget và nhu cầu trạng thái cục bộ.
Thư mục gốc ứng dụng
Khi nào dùng từng loại
Consumer: khối builder cục bộ cho các vùng reactive nhỏ.
ConsumerWidget: widget stateless với build(context, ref).
ConsumerStatefulWidget: widget stateful với ref bên trong ConsumerState.
Ví dụ: ConsumerStatefulWidget
Dùng ConsumerState khi bạn cần cả WidgetRef lẫn trạng thái UI cục bộ có thể thay đổi.
class HomePage extends ConsumerStatefulWidget {
const HomePage({super.key});
@override
ConsumerState<HomePage> createState() => _HomePageState();
}
class _HomePageState extends ConsumerState<HomePage> {
bool expanded = false;
@override
Widget build(BuildContext context) {
final user = ref.watch(currentUser);
return Column(
children: [
Text('$user'),
Switch(
value: expanded,
onChanged: (v) => setState(() => expanded = v),
),
],
);
}
}
Các bước tiếp theo
Kiểm thử
Kiểm tra vòng đời container, các override và cập nhật async trong unit test và widget test.
Mở phần kiểm thử