RiverpodRiverpod

Riverpod في Flutter : عندما تتعمق أكثر في عالم Flutter، تدرك أن تنظيم الحالة ليس مجرد خيار برمجي… بل هو فنّ.
بعد أن تعرّفنا على Provider في المقال السابق، قد تلاحظ أنه رغم بساطته، يحمل بعض العيوب: boilerplate كثير، صعوبة الاختبار، واعتماد كبير على الـ context.
وهنا ظهر البطل الجديد: Riverpod 💪


ما هو Riverpod؟

يمكنك اعتبار Riverpod بأنه الجيل الثاني من Provider — أعيد تصميمه من الصفر ليكون:

  • أكثر أمانًا.
  • أكثر قابلية للاختبار.
  • وأكثر مرونة في التعامل مع الحالات المختلفة (المتزامنة واللا متزامنة).

بل إن مؤلف Riverpod هو نفسه مطور Provider الأصلي — أي أن الأمر أشبه بتطور طبيعي نابع من التجربة السابقة.


لماذا نحتاج Riverpod بدل Provider؟

لنأخذ مثالًا بسيطًا: في Provider، يجب أن يكون لديك BuildContext للوصول إلى الحالة.
لكن في Riverpod، يمكنك الوصول للحالة من أي مكان — حتى من خارج الواجهة.

كما أن Riverpod:

  • لا يعتمد على شجرة الودجات.
  • يعيد بناء الأجزاء المتأثرة فقط.
  • يدعم Async بسهولة (Streams وFutures).
  • ويُختبر بسهولة بدون واجهة مستخدم.

باختصار، هو نظام ذكي لإدارة الحالة يتيح لك كتابة كود أنظف وأكثر مرونة.


الفكرة الأساسية

في Riverpod، بدلًا من الاعتماد على ChangeNotifier, نحن ننشئ ما يسمى بـ Providers — وهي كائنات تمثل “مصادر بيانات” يمكن لأي جزء من التطبيق الاستماع إليها.

أشهر أنواع الـ Providers:

النوعالاستخدام
Providerلقيم ثابتة أو غير متغيرة.
StateProviderلحالات بسيطة قابلة للتغيير (مثل عدّاد).
FutureProviderللتعامل مع البيانات القادمة من API.
StreamProviderللتعامل مع التدفقات (Streams).
StateNotifierProviderلإدارة منطق الحالة المعقدة بطريقة مشابهة لـ Bloc.

مثال عملي بسيط: عدّاد باستخدام Riverpod

الخطوة 1: إضافة الحزمة

dependencies:
  flutter_riverpod: ^2.0.0

ثم استوردها في مشروعك:

import 'package:flutter_riverpod/flutter_riverpod.dart';

الخطوة 2: إنشاء Provider بسيط

final counterProvider = StateProvider<int>((ref) => 0);

هنا أنشأنا StateProvider يمثل عدّاد يبدأ من القيمة صفر.


الخطوة 3: ربط التطبيق بـ Riverpod

void main() {
  runApp(ProviderScope(child: MyApp()));
}

ProviderScope هو الجذر الذي يدير جميع الـ Providers في تطبيقك.


الخطوة 4: استخدام الـ Provider في الواجهة

class MyApp extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Riverpod Counter')),
        body: Center(
          child: Text('$count', style: TextStyle(fontSize: 40)),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => ref.read(counterProvider.notifier).state++,
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

لاحظ الفرق الكبير:

  • لا حاجة لاستخدام ChangeNotifier.
  • لا حاجة لـ context.
  • الوصول للحالة يتم من خلال ref.watch() أو ref.read().

ماذا يحدث هنا؟

  • ref.watch(counterProvider) تعني أننا نراقب القيمة الحالية.
  • عند تغيّر القيمة، Riverpod يقوم تلقائيًا بإعادة بناء الواجهة المتأثرة فقط.
  • ref.read(counterProvider.notifier) تمنحنا التحكم في تعديل الحالة.

نظام مرن، واضح، وسهل التتبع.


العمل مع Future و Stream

إحدى نقاط قوة Riverpod أنه يتعامل مع العمليات غير المتزامنة بسلاسة مذهلة.

مثال: جلب بيانات من API

final userProvider = FutureProvider<String>((ref) async {
  await Future.delayed(Duration(seconds: 2));
  return "Ahmed Flutter Dev";
});

وفي الواجهة:

ref.watch(userProvider).when(
  data: (name) => Text('Welcome $name'),
  loading: () => CircularProgressIndicator(),
  error: (e, _) => Text('Error: $e'),
);

كل ذلك بدون أي setState() أو try-catch تقليدي.
Riverpod يعتني بإدارة الحالة والتعامل مع الخطأ والتحميل تلقائيًا!


مقارنة سريعة: Provider vs Riverpod

الميزةProviderRiverpod
يعتمد على BuildContext✅ نعم❌ لا
يدعم Async (Future/Stream)جزئيًا✅ نعم
اختبار الوحدةصعب نسبيًا✅ سهل جدًا
Boilerplateكثيرأقل بكثير
إعادة البناء الذكيةمحدودة✅ دقيقة جدًا
الأداءجيد✅ أفضل

خلاصة المقال

Riverpod هو أكثر من مجرد تحديث لـ Provider — إنه فلسفة جديدة لإدارة الحالة في Flutter.
يمنحك تحكمًا كاملاً في بياناتك، يخفف من التعقيد، ويجعل الكود أنظف وأسهل للاختبار.

إذا كنت بدأت بـ Provider، فانتقالك إلى Riverpod هو الخطوة الطبيعية التالية نحو الاحتراف.


في المقال القادم ، سننتقل إلى Bloc وCubit — النمط الأكثر قوة وهيكلة في عالم إدارة الحالة.
ستتعلم كيف تنظم منطق الأعمال (Business Logic) بشكل احترافي في تطبيقات Flutter الضخمة.


By احمد علي

مطور تطبيقات هواتف ذكية باستخدام Flutter، وصانع محتوى تقني يكتب عن الذكاء الاصطناعي والبرمجة وتطورات التكنولوجيا الحديثة. أسعى لتبسيط الأفكار المعقدة ومشاركة خبرتي مع المهتمين بالمجال.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *