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(),
);
अर्का चरणहरू
प्रोभाइडरहरू र पढाइ
watch/read/listen र AsyncProvider.future का ठोस pattern हरू हेर्नुहोस्।
प्रोभाइडरहरू खोल्नुहोस्म्युटेशनहरू
mutation token, mutate, र ref.invoke प्रयोग गरेर state updates लागू गर्नुहोस्।
Mutations खोल्नुहोस्