Principi di progettazione dietro miniriverpod.
Il pacchetto restringe volutamente le funzionalità per mantenere esplicito il comportamento: identità del provider basata sugli args, iniezione con Scope e semantica di rilascio prevedibile.
Cosa cambia rispetto a Riverpod
Invece delle family class generate e dei canali notifier impliciti, miniriverpod preferisce sottoclasse + args + invoke esplicito.
Identità del provider
runtimeType + hash degli args
alternativa alla family
Deriva Provider / AsyncProvider e passa super.args((...))
fallback DI
Scope<T>.required + overrideWithValue
Perché è importante
Puoi ragionare su uguaglianza e override a partire da normali costruttori Dart, il che mantiene semplici debug e test.
Identità del provider con args
args definisce la chiave del provider, quindi args uguali significano la stessa voce di cache all'interno di un ProviderContainer.
Regola di identità
Conseguenze pratiche
- Non è necessario un tipo family dedicato.
- L'override per argomento si fa creando istanze del provider.
- Mantieni args stabili e immutabili per una cache prevedibile.
Esempio: provider simile a family + fallback di Scope
Usa un argomento del costruttore come identità e inietta un'istanza di fallback tramite 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);
}
}
// Iniezione
ProviderScope(
overrides: [
ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
],
child: const App(),
);
Prossimi passi
Provider e letture
Vedi pattern concreti per watch/read/listen e AsyncProvider.future.
Apri i providerMutazioni
Implementa aggiornamenti di stato con i mutation token, mutate e ref.invoke.
Apri le mutazioni