Ergonomía al estilo Riverpod con comportamiento explícito en tiempo de ejecución.

miniriverpod mantiene Provider y AsyncProvider familiares, pero acota el comportamiento a APIs explícitas: subclass + args para una identidad tipo familia, mutation tokens para las actualizaciones y una eliminación del ciclo de vida predecible.

Sin generación de código

Los providers tipo familia, los overrides y la inyección de dependencias se modelan con subclass + args + Scope, sin generación de código.

Modelo asíncrono unificado

Un único AsyncProvider gestiona Future y Stream, con cancelación estricta en rebuild, invalidate, refresh y dispose.

Concurrencia integrada

Las llamadas de mutación admiten concurrent, queue, restart y dropLatest a través de ref.invoke(provider.method()).

Flujo recomendado de introducción

Envuelve tu app con ProviderScope, define clases Provider/AsyncProvider y ejecuta actualizaciones de estado a través de ref.invoke con concurrencia explícita.

Instalar

flutter pub add miniriverpod

Mutación + Invoke

lib/main.dart
class UserProvider extends AsyncProvider<User?> {
  UserProvider() : super.args(null);

  late final renameMut = mutation<void>(#rename);

  Call<void, AsyncValue<User?>> rename(String name) => mutate(
    renameMut,
    (ref) async {
      final api = ref.watch(apiProvider);
      await api.rename(name);
      ref.state = AsyncData(await api.me());
    },
    concurrency: Concurrency.restart,
  );
}

// UI
await ref.invoke(userProvider.rename('Alice'));
Nota de compatibilidad

miniriverpod mantiene deliberadamente Provider + AsyncProvider + WidgetRef la cercanía con Riverpod, pero reemplaza las rutas que dependen mucho de codegen con subclass + args, inyección basada en Scope y llamadas de mutación explícitas.