Compilación segura
No más ProviderNotFoundException
u olvidarse de manejar los estados de carga. Usando Riverpod, si tu código compila, funciona.
Provider, sin sus limitaciones
Riverpod está inspirado en Provider pero resuelve algunos de sus problemas clave, como soportar múltiples providers del mismo tipo; esperar por providers asincrónicos; agregar providers desde cualquier lugar, ...
No depende de Flutter
Crea/comparte/prueba providers, sin depender de Flutter. Esto incluye poder escuchar providers sin un BuildContext
.
Declara un estado compartido desde cualquier lugar
Ya no es necesario saltar entre tu main.dart
y tus archivos de interfaz de usuario. Escribe el código de tu estado compartido donde pertenece, ya sea en un paquete separado o justo al lado del Widget que lo necesita, sin perder la capacidad de hacer pruebas.
// A shared state that can be accessed by multiple
// objects at the same time
final countProvider = StateProvider((ref) => 0);
// Consumes the shared state and rebuild when it changes
class Title extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(countProvider);
return Text('$count');
}
}
Recalcular el estado y reconstruir el interfaz solo cuando sea necesario
Ya no tenemos que ordenar y/o filtrar listas dentro del método build
o tener que recurrir a un mecanismo de caché avanzado.
Con Provider
y "families", puedes ordenar tus listas o hacer solicitudes HTTP solo cuando realmente lo necesites.
final todosProvider = StateProvider<List<Todo>>((ref) => []);
final filterProvider = StateProvider<Filter>((ref) => Filter.all);
final filteredTodosProvider = Provider<List<Todo>>((ref) {
final todos = ref.watch(todosProvider);
switch (ref.watch(filterProvider)) {
case Filter.all:
return todos;
case Filter.completed:
return todos.where((todo) => todo.completed).toList();
case Filter.uncompleted:
return todos.where((todo) => !todo.completed).toList();
}
});
Lea los providers de forma segura
Leer un provider nunca resultará en un mal estado. Si puedes escribir el código necesario para leer un provider, obtendrás un valor válido.
Esto incluso se aplica a los valores obtenidos de forma asíncrona. A diferencia de Provider, Riverpod te permite manejar de forma limpia los casos de carga y error.
final configurationsProvider = FutureProvider<Configuration>((ref) async {
final uri = Uri.parse('configs.json');
final rawJson = await File.fromUri(uri).readAsString();
return Configuration.fromJson(json.decode(rawJson));
});
class Example extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final configs = ref.watch(configurationsProvider);
// Use Riverpod's built-in support
// for error/loading states using "when":
return configs.when(
loading: () => const CircularProgressIndicator(),
error: (err, stack) => Text('Error $err'),
data: (configs) => Text('data: ${configs.host}'),
);
}
}
Inspecciona tu estado en el devtool
Usando Riverpod, por defecto, tu estado es visible dentro del devtool de Flutter. Por si fuera poco, una herramienta integral de inspección de estados esta en desarrollo.
