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
| الميزة | Provider | Riverpod |
|---|---|---|
| يعتمد على BuildContext | ✅ نعم | ❌ لا |
| يدعم Async (Future/Stream) | جزئيًا | ✅ نعم |
| اختبار الوحدة | صعب نسبيًا | ✅ سهل جدًا |
| Boilerplate | كثير | أقل بكثير |
| إعادة البناء الذكية | محدودة | ✅ دقيقة جدًا |
| الأداء | جيد | ✅ أفضل |
خلاصة المقال
Riverpod هو أكثر من مجرد تحديث لـ Provider — إنه فلسفة جديدة لإدارة الحالة في Flutter.
يمنحك تحكمًا كاملاً في بياناتك، يخفف من التعقيد، ويجعل الكود أنظف وأسهل للاختبار.
إذا كنت بدأت بـ Provider، فانتقالك إلى Riverpod هو الخطوة الطبيعية التالية نحو الاحتراف.
في المقال القادم ، سننتقل إلى Bloc وCubit — النمط الأكثر قوة وهيكلة في عالم إدارة الحالة.
ستتعلم كيف تنظم منطق الأعمال (Business Logic) بشكل احترافي في تطبيقات Flutter الضخمة.

