עקרונות העיצוב מאחורי miniriverpod.
החבילה מצמצמת במכוון את היכולות כדי לשמור על התנהגות מפורשת: זהות provider לפי args, הזרקה היקפית באמצעות Scope, וסמנטיקת dispose צפויה.
מה משתנה לעומת Riverpod
במקום מחלקות family שנוצרות אוטומטית וערוצי notifier מרומזים, miniriverpod מעדיף תת-מחלקה + args + invoke מפורש.
זהות Provider
runtimeType + גיבוב args
חלופה ל-family
צרו תת-מחלקה של Provider / AsyncProvider והעבירו super.args((...)).
גיבוי DI
Scope<T>.required + overrideWithValue
למה זה חשוב
אפשר להסיק שוויון ו-override-ים מתוך בנאי Dart רגילים, מה שהופך את הדיבוג והבדיקות לפשוטים.
זהות Provider עם args
args מגדיר את מפתח ה-provider, ולכן args זהים משמעו אותה רשומת cache בתוך ProviderContainer.
כלל הזהות
השלכות מעשיות
- לא נדרש טיפוס family ייעודי.
- עקיפה לפי ארגומנט נעשית על ידי יצירת מופעי provider.
- שמרו על args יציבים ובלתי ניתנים לשינוי עבור caching צפוי.
דוגמה: provider בסגנון family + גיבוי דרך Scope
השתמשו בארגומנט הבנאי כזהות והזריקו מופע גיבוי דרך Scope.
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);
}
}
// הזרקה
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
השלבים הבאים
Providers וקריאות
ראו דפוסים קונקרטיים עבור watch/read/listen ו-AsyncProvider.future.
פתחו Providers