ادغام 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),
        ),
      ],
    );
  }
}
منطق داخلی Consumer بازسازی‌ها را به پس‌فریم زمان‌بندی می‌کند و مشکل setState هنگام build را کمتر می‌کند.
WidgetRef.watch را فقط برای مقادیری استفاده کنید که باید بازسازی را فعال کنند.
کنش‌های جانبی را بیرون از build نگه دارید؛ از callbackها و متدهای invoke/refresh استفاده کنید.

گام‌های بعدی

تست‌ها

چرخهٔ عمر container، overrideها و به‌روزرسانی‌های async را در تست‌های واحد و ویجت اعتبارسنجی کنید.

باز کردن تست‌ها

مرجع API

امضاهای ProviderScope، WidgetRef و متدهای container را ببینید.

باز کردن مرجع API