miniriverpod पछाडिका डिजाइन सिद्धान्तहरू।

यो प्याकेजले व्यवहारलाई स्पष्ट राख्नका लागि सुविधाहरूलाई जानाजानी साँघुरो बनाउँछ: args द्वारा provider पहिचान, Scope मार्फत scoped injection, र अनुमानयोग्य disposal semantics।

Riverpod बाट के परिवर्तन हुन्छ

उत्पन्न family classes र implicit notifier channels को सट्टा, miniriverpod ले subclass + args + explicit invoke लाई प्राथमिकता दिन्छ।

Provider पहिचान

runtimeType + args hash

family विकल्प

Provider / AsyncProvider लाई subclass बनाउनुहोस् र super.args((...)) पास गर्नुहोस्

DI fallback

Scope<T>.required + overrideWithValue

यो किन महत्त्वपूर्ण छ

साधारण Dart constructors बाट equality र overrides बारे तर्क गर्न सकिन्छ, जसले debugging र tests लाई सरल राख्छ।

args सहित Provider पहिचान

args ले provider key परिभाषित गर्छ, त्यसैले समान args भनेको ProviderContainer भित्रको उही cache entry हो।

पहिचान नियम

व्यावहारिक प्रभावहरू

- छुट्टै family type आवश्यक छैन।
- प्रत्येक argument का लागि override provider instances बनाएर गरिन्छ।
- अनुमानयोग्य caching का लागि args स्थिर र immutable राख्नुहोस्।

उदाहरण: family-जस्तै provider + Scope fallback

constructor argument लाई पहिचानको रूपमा प्रयोग गर्नुहोस् र Scope मार्फत fallback instance inject गर्नुहोस्।

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 ले dependency wiring लाई स्पष्ट र परीक्षणमैत्री राख्छ।
overrideWithValue ले args-आधारित instance सहित प्रत्येक provider instance मा काम गर्छ।
subclass + args प्रयोग गर्दा autoDispose व्यवहार उही रहन्छ।

अर्का चरणहरू

प्रोभाइडरहरू र पढाइ

watch/read/listen र AsyncProvider.future का ठोस pattern हरू हेर्नुहोस्।

प्रोभाइडरहरू खोल्नुहोस्

म्युटेशनहरू

mutation token, mutate, र ref.invoke प्रयोग गरेर state updates लागू गर्नुहोस्।

Mutations खोल्नुहोस्