עקרונות העיצוב מאחורי 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(),
);
Scope שומר על חיווט התלויות מפורש וידידותי לבדיקה.
overrideWithValue עובד לכל מופע של provider, כולל מופעים מבוססי args.
התנהגות autoDispose נשארת ללא שינוי כאשר משתמשים בתת-מחלקה + args.

השלבים הבאים

Providers וקריאות

ראו דפוסים קונקרטיים עבור watch/read/listen ו-AsyncProvider.future.

פתחו Providers

Mutations

ממשו עדכוני מצב עם mutation tokens, mutate ו-ref.invoke.

פתחו Mutations