การผสาน Flutter พร้อมการเป็นเจ้าของ container ที่ระบุชัดเจน.
ProviderScope สามารถเป็นเจ้าของ container เองหรือรับมาจากภายนอกได้. API ของ Consumer ทำให้การเข้าถึง WidgetRef ยังคงเข้ากันได้กับโค้ดสไตล์ Riverpod.
การเป็นเจ้าของ ProviderScope
การเป็นเจ้าของ container มีผลต่อความรับผิดชอบในการ dispose.
container ภายใน
ProviderScope(child: ...) dispose อัตโนมัติ
container ภายนอก
ProviderScope(container: c, ...) ต้องให้ผู้เรียกเรียก c.dispose()
scope ที่ไม่ถูกควบคุม
UncontrolledProviderScope จะไม่ dispose container
ข้อผิดพลาดที่พบบ่อย
ในการทดสอบ widget ให้จำไว้ว่าต้อง dispose ProviderContainer ที่ถูก inject จากภายนอก เพื่อหลีกเลี่ยง timer leak ที่ยังค้างอยู่.
รูปแบบของ Consumer
ทุกตัวเลือกจะเปิดเผย WidgetRef; เลือกตามสไตล์ของ widget และความต้องการของสถานะภายใน.
รากของแอป
ควรใช้เมื่อใด
Consumer: บล็อก builder ภายในสำหรับพื้นที่ reactive ขนาดเล็ก.
ConsumerWidget: widget แบบ stateless พร้อม build(context, ref).
ConsumerStatefulWidget: widget แบบ stateful พร้อม ref อยู่ภายใน ConsumerState.
ตัวอย่าง: ConsumerStatefulWidget
ใช้ ConsumerState เมื่อคุณต้องการทั้ง WidgetRef และสถานะ UI แบบเปลี่ยนแปลงได้ภายในเครื่อง.
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),
),
],
);
}
}
ขั้นตอนถัดไป
การทดสอบ
ตรวจสอบวงจรชีวิตของ container, override และการอัปเดตแบบ async ในการทดสอบ unit และ widget.
เปิดการทดสอบข้อมูลอ้างอิง API
ดู signature ของ ProviderScope, WidgetRef และเมธอดของ container.
เปิดข้อมูลอ้างอิง API