المبادئ التصميمية وراء miniriverpod.
الحزمة تهدف إلى تقليل الميزات للحفاظ على سلوك واضح: هوية المزود عبر المعلمات، حقن موجه، وسلوك التخلص المتوقع.
ما هي التغييرات من Riverpod
بدلاً من إنشاء فئات عائلية وقنوات إخطار ضمنية، يفضل miniriverpod إنشاء فئة فرعية + وسائط + استدعاء صريح.
هوية المزود
نوع وقت التشغيل + تجزئة الوسائط
عائلة بديلة
Subclass Provider / AsyncProvider و تمرير super.args((...))
الخيار الاحتياطي
النطاق<T>.إلزامي + تجاوز القيمة
لماذا هذا مهم
يمكنك التفكير في المساواة والتعارضات من خلال مُنشئات Dart البسيطة، مما يبسط عملية التصحيح والاختبار.
معرف المزود مع الوسائط
args تحدد مفتاح المزود، لذا فإن قيم args المتساوية تعني نفس الإدخال في ذاكرة التخزين المؤقت داخل حاوية المزود.
قاعدة الهوية
النتائج العملية
- لا يلزم تحديد نوع العائلة.
- يتم تجاوز المعاملات عن طريق إنشاء مثيلات المزود.
- حافظ على المعاملات ثابتة وغير قابلة للتغيير لضمان التخزين المؤقت المتوقع.
مزود مماثل للعائلة + الرجوع إلى النطاق
استخدم وسيط البناء كمعرف وقم بإدخال نسخة احتياطية من خلال النطاق.
فئة ProductProvider توسيع AsyncProvider<List<Product>> {
ProductProvider(({this.search = 'empty'})) : super.args((search,));
أخيرًا String search;
ثابت ثابت fallback = Scope<ProductProvider>.required('product.fallback');
@override
FutureOr<List<Product>> build(ref) async {
أخيرًا api = ref.watch(productsApiProvider);
إرجاع api.search(q: search);
}
}
// حقن
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: ثابت App(),
);
النطاق يحافظ على توصيل الاعتماديات بشكل صريح ويسهل الاختبار.
overrideWithValue يعمل لكل مثيل مزود، بما في ذلك المثيلات القائمة على الوسائط.
سلوك التخلص التلقائي لم يتغير باستخدام فئة فرعية + وسائط.