miniriverpodin suunnitteluperiaatteet.
Paketti rajoittaa ominaisuuksia tarkoituksella, jotta kayttaytyminen pysyy selkeana: providerin identiteetti argsien perusteella, Scope-injektio ja ennustettava dispose-kayttaytyminen.
Mita muuttuu Riverpodiin verrattuna
Generoituja family-luokkia ja implisiittisia notifier-kanavia sijaan miniriverpod suosii aliluokkaa + args + selkeaa invokea.
Providerin identiteetti
runtimeType + args-hash
family-vaihtoehto
Luo Providerista / AsyncProviderista aliluokka ja anna eteenpain super.args((...)).
DI-vararatkaisu
Scope<T>.required + overrideWithValue
Miksi tama on tarkeaa
Voit paatella yhtalaisyydet ja overridet tavallisista Dart-konstruktoreista, mika pitaa debugauksen ja testit suoraviivaisina.
Providerin identiteetti argsien avulla
args maarittaa providerin avaimen, joten samat argsit tarkoittavat samaa cache-merkintaa ProviderContainerissa.
Identiteettisaanto
Kaytannolliset seuraukset
- Erillista family-tyyppia ei tarvita.
- Argumenttikohtainen override tehdaan luomalla provider-instansseja.
- Pida argsit vakaina ja muuttumattomina ennustettavaa valimuistia varten.
Esimerkki: family-tyyppinen provider + Scope-vararatkaisu
Kayta konstruktorin argumenttia identiteettina ja injektoi fallback-instanssi Scopein kautta.
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);
}
}
// Injektointi
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Seuraavat askeleet
Providerit ja lukeminen
Katso konkreettisia malleja watch/read/listen- ja AsyncProvider.future-kayttoon.
Avaa provideritMutaatiot
Toteuta tilapaivitykset mutation-tokenien, mutate-toiminnon ja ref.invoke-kutsun avulla.
Avaa mutaatiot