ادغام Flutter با مالکیت صریح container.
ProviderScope میتواند مالک یک container باشد یا آن را از بیرون دریافت کند. APIهای Consumer دسترسی به WidgetRef را با کدِ سبک Riverpod سازگار نگه میدارند.
مالکیت ProviderScope
مالکیت container مسئولیت dispose را تغییر میدهد.
container داخلی
ProviderScope(child: ...) بهصورت خودکار dispose میشود
container خارجی
ProviderScope(container: c, ...) مستلزم فراخوانی c.dispose() توسط caller است
scope غیرکنترلشده
UncontrolledProviderScope هرگز container را dispose نمیکند
اشتباه رایج
در تستهای ویجت، فراموش نکنید ProviderContainer تزریقشده از بیرون را dispose کنید تا از نشت timerهای معلق جلوگیری شود.
گونههای Consumer
همهٔ گزینهها WidgetRef را در اختیار میگذارند؛ بر اساس سبک ویجت و نیاز به وضعیت محلی انتخاب کنید.
ریشهٔ برنامه
هرکدام را چه زمانی استفاده کنیم
Consumer: بلوک سازندهٔ محلی برای نواحی واکنشی کوچک.
ConsumerWidget: ویجت بدون state با build(context, ref).
ConsumerStatefulWidget: ویجت stateful با ref درون ConsumerState.
نمونه: ConsumerStatefulWidget
وقتی هم به WidgetRef و هم به وضعیت محلیِ قابل تغییرِ رابط کاربری نیاز دارید، از ConsumerState استفاده کنید.
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 را در تستهای واحد و ویجت اعتبارسنجی کنید.
باز کردن تستها