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(),
);
Scope mantiene il wiring delle dipendenze esplicito e adatto ai test.
overrideWithValue funziona per ogni istanza del provider, comprese quelle basate su args.
Il comportamento di autoDispose non cambia usando sottoclasse + args.

Prossimi passi

Provider e letture

Vedi pattern concreti per watch/read/listen e AsyncProvider.future.

Apri i provider

Mutazioni

Implementa aggiornamenti di stato con i mutation token, mutate e ref.invoke.

Apri le mutazioni