Návrhové princípy za miniriverpodom.
Balík zámerne zužuje funkcie, aby správanie zostalo explicitné: identita providera podľa args, injektovanie v scope a predvídateľná semantika uvoľňovania.
Čo sa mení oproti Riverpodu
Namiesto generovaných family tried a implicitných kanálov notifikácií miniriverpod uprednostňuje subclass + args + explicit invoke.
Identita providera
runtimeType + hash args
alternatíva k family
Zdedte Provider / AsyncProvider a odovzdajte super.args((...))
DI záloha
Scope<T>.required + overrideWithValue
Prečo je to dôležité
O rovnosti a overrideoch môžete uvažovať z bežných Dart konštruktorov, čo udržuje ladenie aj testy jednoduché.
Identita providera s args
args definuje kľúč providera, takže rovnaké args znamenajú rovnakú cache položku v ProviderContaineri.
Pravidlo identity
Praktické dôsledky
- Nie je potrebný vyhradený family typ.
- Prepísanie pre každý argument sa robí vytvorením inštancií providera.
- Udržujte args stabilné a nemenné pre predvídateľné cachovanie.
Príklad: provider podobný family + záložný Scope
Použite argument konštruktora ako identitu a cez Scope vložte záložnú inštanciu.
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);
}
}
// Vložiť
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Ďalšie kroky
Providery a čítanie
Pozrite si konkrétne vzory pre watch/read/listen a AsyncProvider.future.
Otvoriť provideryMutácie
Implementujte aktualizácie stavu pomocou mutation tokenov, mutate a ref.invoke.
Otvoriť mutácie