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