Principi dizajna iza miniriverpoda.
Paket namerno sužava mogućnosti kako bi ponašanje ostalo eksplicitno: identitet provajdera preko args, injekcija kroz Scope i predvidiva semantika oslobađanja.
Šta se menja u odnosu na Riverpod
Umesto generisanih family klasa i implicitnih kanala notifikacija, miniriverpod preferira subclass + args + eksplicitni invoke.
Identitet provajdera
runtimeType + args hash
Alternativa za family
Nasledite Provider / AsyncProvider i prosledite super.args((...))
DI rezervna opcija
Scope<T>.required + overrideWithValue
Zašto je ovo važno
Možete rezonovati o jednakosti i override-ovima iz običnih Dart konstruktora, što održava debagovanje i testove jednostavnim.
Identitet provajdera sa args
args definiše ključ provajdera, pa jednaki args znače isti cache zapis unutar ProviderContainer-a.
Pravilo identiteta
Praktične posledice
- Nije potreban poseban family tip.
- Nadjačavanje po argumentu radi se kreiranjem instanci provajdera.
- Držite args stabilnim i nepromenljivim radi predvidivog keširanja.
Primer: provider nalik family + Scope rezervna opcija
Koristite argument konstruktora kao identitet i ubacite rezervnu instancu kroz 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);
}
}
// Umetni
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Sledeći koraci
Provajderi i čitanje
Pogledajte konkretne obrasce za watch/read/listen i AsyncProvider.future.
Otvori provajdere