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(),
);
Étapes suivantes
Providers et lectures
Consultez des schémas concrets pour watch/read/listen et AsyncProvider.future.
Ouvrir les providersMutations
Implémentez des mises à jour d'état avec des mutation tokens, mutate et ref.invoke.
Ouvrir les mutations