Načela zasnove za miniriverpod.
Paket namenoma zoži funkcionalnosti, da ostane vedenje eksplicitno: identiteta ponudnika prek args, injiciranje v scope in predvidljiva semantika odstranjevanja.
Kaj se spremeni glede na Riverpod
Namesto generiranih family razredov in implicitnih kanalov za obveščanje miniriverpod raje uporablja subclass + args + eksplicitni invoke.
Identiteta ponudnika
runtimeType + hash args
alternativa family
Dedujte iz Provider / AsyncProvider in posredujte super.args((...))
DI rezerva
Scope<T>.required + overrideWithValue
Zakaj je to pomembno
O enakosti in overrideih lahko razmišljate iz navadnih Dart konstruktorjev, kar ohranja odpravljanje napak in teste preproste.
Identiteta ponudnika z args
args določa ključ ponudnika, zato enaki args pomenijo isti vnos predpomnilnika znotraj ProviderContainerja.
Pravilo identitete
Praktične posledice
- Poseben tip family ni potreben.
- Prepisovanje po argumentu se izvede z ustvarjanjem primerkov ponudnika.
- Args ohranjajte stabilne in nespremenljive za predvidljivo predpomnjenje.
Primer: provider, podoben family + rezervni Scope
Uporabite argument konstruktorja kot identiteto in prek Scope vstavite rezervni primerek.
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);
}
}
// Vstavi
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Naslednji koraki
Ponudniki in branje
Oglejte si konkretne vzorce za watch/read/listen in AsyncProvider.future.
Odpri ponudnike