miniriverpod मागील डिझाइन तत्त्वे.
पॅकेज वर्तन स्पष्ट राहावे म्हणून वैशिष्ट्ये मुद्दाम मर्यादित करते: args वर आधारित provider ओळख, Scope द्वारे scoped injection, आणि अंदाज करता येणारी disposal semantics.
Riverpod पासून काय बदलते
निर्मित family classes आणि implicit notifier channels ऐवजी, miniriverpod subclass + args + explicit invoke ला प्राधान्य देतो.
Provider identity
runtimeType + args hash
family alternative
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.
Identity rule
व्यावहारिक परिणाम
- वेगळ्या 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);
}
}
// Inject
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
पुढील पावले
प्रोव्हायडर आणि वाचन
watch/read/listen आणि AsyncProvider.future साठी ठोस patterns पहा.
प्रोव्हायडर उघडा