Principes de conception de miniriverpod.

Le package réduit volontairement les fonctionnalités pour garder un comportement explicite : identité du provider par args, injection via Scope et sémantique de suppression prévisible.

Ce qui change par rapport à Riverpod

Au lieu de classes family générées et de canaux notifier implicites, miniriverpod préfère sous-classe + args + invoke explicite.

Identité du provider

runtimeType + hash des args

Alternative à family

Créez une sous-classe de Provider / AsyncProvider et passez super.args((...)).

Repli DI

Scope<T>.required + overrideWithValue

Pourquoi c'est important

Vous pouvez raisonner sur l'égalité et les remplacements à partir de constructeurs Dart ordinaires, ce qui garde le débogage et les tests simples.

Identité du provider avec args

args définit la clé du provider, donc des args égaux signifient la même entrée de cache dans un ProviderContainer.

Règle d'identité

Conséquences pratiques

- Aucun type family dédié n'est nécessaire.
- Le remplacement par argument se fait en créant des instances de provider.
- Gardez des args stables et immuables pour un cache prévisible.

Exemple : provider de type family + repli via Scope

Utilisez un argument de constructeur comme identité et injectez une instance de repli via 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);
  }
}

// Injection
ProviderScope(
  overrides: [
    ProductProvider.fallback.overrideWithValue(ProductProvider(search: 'jeans')),
  ],
  child: const App(),
);
Scope garde le câblage des dépendances explicite et facile à tester.
overrideWithValue fonctionne pour chaque instance de provider, y compris les instances basées sur args.
Le comportement d'autoDispose ne change pas lorsque l'on utilise une sous-classe + args.

Étapes suivantes

Providers et lectures

Consultez des schémas concrets pour watch/read/listen et AsyncProvider.future.

Ouvrir les providers

Mutations

Implémentez des mises à jour d'état avec des mutation tokens, mutate et ref.invoke.

Ouvrir les mutations