Οι αρχές σχεδίασης πίσω από το miniriverpod.
Το πακέτο περιορίζει σκόπιμα τις δυνατότητες για να κρατά τη συμπεριφορά ρητή: ταυτότητα provider με args, έγχυση με Scope και προβλέψιμη συμπεριφορά διάθεσης.
Τι αλλάζει σε σχέση με το Riverpod
Αντί για παραγόμενες family κλάσεις και έμμεσα notifier channels, το miniriverpod προτιμά υποκλάση + args + ρητό invoke.
Ταυτότητα provider
runtimeType + hash των args
Εναλλακτική του family
Κάντε υποκλάση του Provider / AsyncProvider και περάστε super.args((...)).
DI fallback
Scope<T>.required + overrideWithValue
Γιατί έχει σημασία
Μπορείτε να συλλογίζεστε για την ισότητα και τα overrides από απλούς Dart constructors, κάτι που κρατά τον εντοπισμό σφαλμάτων και τις δοκιμές απλά.
Ταυτότητα provider με args
Το args ορίζει το κλειδί του provider, άρα ίδια args σημαίνει ίδια καταχώριση cache μέσα σε ένα ProviderContainer.
Κανόνας ταυτότητας
Πρακτικές συνέπειες
- Δεν απαιτείται ειδικός family τύπος.
- Το override ανά argument γίνεται με τη δημιουργία provider instances.
- Κρατήστε τα args σταθερά και αμετάβλητα για προβλέψιμο caching.
Παράδειγμα: provider τύπου family + fallback μέσω Scope
Χρησιμοποιήστε ένα όρισμα του constructor ως ταυτότητα και εισαγάγετε μια εφεδρική instance μέσω 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 και αναγνώσεις
Δείτε συγκεκριμένα patterns για watch/read/listen και AsyncProvider.future.
Άνοιγμα ProvidersΜεταλλάξεις
Υλοποιήστε ενημερώσεις κατάστασης με mutation tokens, mutate και ref.invoke.
Άνοιγμα Mutations