{"id":944,"date":"2023-03-10T01:58:26","date_gmt":"2023-03-10T00:58:26","guid":{"rendered":"https:\/\/7ret.com\/?p=944"},"modified":"2023-03-16T01:29:34","modified_gmt":"2023-03-16T00:29:34","slug":"flutter-riverpod-gestion-eficiente-del-estado","status":"publish","type":"post","link":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/","title":{"rendered":"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod."},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Introducci\u00f3n a Riverpod<\/h1>\n\n\n\n<p>Riverpod es una biblioteca de gesti\u00f3n de estado para Flutter. Es una alternativa a otras bibliotecas populares como Provider, que proporciona una manera simple y eficiente de administrar y compartir el estado entre los widgets en tu aplicaci\u00f3n.<\/p>\n\n\n\n<p>Riverpod est\u00e1 dise\u00f1ado para ser f\u00e1cil de usar y entender, y se basa en la sintaxis de Dart moderna para proporcionar una experiencia de desarrollo fluida. En este art\u00edculo, vamos a explorar las caracter\u00edsticas clave de Riverpod y c\u00f3mo puedes utilizarlo en tu aplicaci\u00f3n Flutter.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u00bfQu\u00e9 es Riverpod?<\/h1>\n\n\n\n<p>Riverpod es una biblioteca de gesti\u00f3n de estado para Flutter que se basa en la sintaxis moderna de Dart. Es una alternativa a Provider, otra biblioteca popular de gesti\u00f3n de estado en Flutter.<\/p>\n\n\n\n<p>En lugar de utilizar clases de cambio de notificaci\u00f3n, Riverpod utiliza una combinaci\u00f3n de constructores y funciones de f\u00e1brica para proporcionar un enfoque m\u00e1s moderno y f\u00e1cil de entender para la gesti\u00f3n de estado.<\/p>\n\n\n\n<p>Riverpod se basa en el concepto de \u00abproveedores\u00bb, que son objetos que pueden ser compartidos por varios widgets en tu aplicaci\u00f3n. Los proveedores pueden ser instancias de una clase, funciones, o cualquier otro objeto que desees compartir.<\/p>\n\n\n\n<p>Para acceder a un proveedor en tu widget, simplemente utilizas el widget <code>Consumer<\/code> o el m\u00e9todo <code>ref.watch<\/code> para observar cambios en el proveedor. Si el estado del proveedor cambia, el widget se reconstruye autom\u00e1ticamente.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Configuraci\u00f3n de Riverpod<\/h1>\n\n\n\n<p>Para utilizar Riverpod en tu aplicaci\u00f3n Flutter, debes agregarlo como una dependencia en tu archivo <code>pubspec.yaml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-d1403f2c\"><code lang=\"json\" class=\"language-json\"><code>dependencies:\n  flutter:\n    sdk: flutter\n  riverpod: ^1.0.3\n<\/code><\/code><\/pre>\n\n\n\n<p>Una vez que hayas agregado Riverpod a tu archivo <code>pubspec.yaml<\/code>, debes importarlo en tus archivos Dart donde desees utilizarlo:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-e3168c35\"><code lang=\"dart\" class=\"language-dart\"><code>import 'package:flutter_riverpod\/flutter_riverpod.dart';\n<\/code><\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Proveedores (Providers)<\/h1>\n\n\n\n<p>En Riverpod, los proveedores son objetos que pueden ser compartidos por varios widgets en tu aplicaci\u00f3n. Los proveedores pueden ser instancias de una clase, funciones, o cualquier otro objeto que desees compartir.<\/p>\n\n\n\n<p>Para crear un proveedor, utilizas el m\u00e9todo <code>Provider<\/code> o <code>StateNotifierProvider<\/code>, que es una variante de <code>Provider<\/code> dise\u00f1ada para trabajar con el patr\u00f3n de dise\u00f1o de Notificador de Estado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proveedor b\u00e1sico<\/h2>\n\n\n\n<p>El siguiente ejemplo muestra c\u00f3mo crear un proveedor b\u00e1sico que devuelve una cadena:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-0ba565d5\"><code lang=\"dart\" class=\"language-dart\"><code>final greetingProvider = Provider((_) =&gt; 'Hello, world!');\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>greetingProvider<\/code> es un proveedor que devuelve una cadena de saludo. Para acceder a esta cadena en un widget, utilizas el widget <code>Consumer<\/code> o el m\u00e9todo <code>ref.watch<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-9d02ba7b\"><code lang=\"dart\" class=\"language-dart\"><code>class GreetingWidget extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final greeting = ref.watch(greetingProvider);\n    return Text(greeting);\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>GreetingWidget<\/code> es un widget que utiliza <code>ConsumerWidget<\/code> para acceder al proveedor <code>greetingProvider<\/code> y mostrar el saludo en un widget <code>Text<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proveedor de estado (State Provider)<\/h2>\n\n\n\n<p>En Riverpod, tambi\u00e9n puedes crear proveedores de estado utilizando el m\u00e9todo <code>StateNotifierProvider<\/code>. Estos proveedores son ideales para trabajar con el patr\u00f3n de Notificador de Estado, que es un patr\u00f3n de dise\u00f1o com\u00fan en Flutter para actualizar el estado de un widget.<\/p>\n\n\n\n<p>Para crear un proveedor de estado, primero debes crear una clase que extienda <code>StateNotifier<\/code> y que contenga la l\u00f3gica para actualizar el estado del proveedor. Por ejemplo, aqu\u00ed hay una clase <code>Counter<\/code> que mantiene el estado de un contador:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-4fe47db8\"><code lang=\"dart\" class=\"language-dart\"><code>class Counter extends StateNotifier&lt;int&gt; {\n  Counter() : super(0);\n\n  void increment() =&gt; state++;\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, la clase <code>Counter<\/code> extiende <code>StateNotifier&lt;int&gt;<\/code>, lo que indica que el estado del proveedor es un entero. El constructor de <code>Counter<\/code> inicializa el estado en 0.<\/p>\n\n\n\n<p>La clase <code>Counter<\/code> tambi\u00e9n contiene un m\u00e9todo <code>increment()<\/code> que actualiza el estado del proveedor al incrementar el contador en 1.<\/p>\n\n\n\n<p>Para crear un proveedor de estado utilizando <code>StateNotifierProvider<\/code>, debes pasar una instancia de la clase <code>Counter<\/code> al constructor de <code>StateNotifierProvider<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-e758c7fd\"><code lang=\"dart\" class=\"language-dart\"><code>final counterProvider = StateNotifierProvider((_) =&gt; Counter());\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>counterProvider<\/code> es un proveedor de estado que utiliza la clase <code>Counter<\/code> para mantener el estado del contador. Para acceder al estado del contador en un widget, utilizas el widget <code>Consumer<\/code> o el m\u00e9todo <code>ref.watch<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-6270cb1a\"><code lang=\"dart\" class=\"language-dart\"><code>class CounterWidget extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final counter = ref.watch(counterProvider);\n    return Column(\n      children: [\n        Text(counter.toString()),\n        ElevatedButton(\n          onPressed: () =&gt; ref.read(counterProvider.notifier).increment(),\n          child: Text('Increment'),\n        ),\n      ],\n    );\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>CounterWidget<\/code> es un widget que utiliza <code>ConsumerWidget<\/code> para acceder al proveedor <code>counterProvider<\/code> y mostrar el estado del contador en un widget <code>Text<\/code>. El widget tambi\u00e9n contiene un bot\u00f3n que llama al m\u00e9todo <code>increment()<\/code> de la clase <code>Counter<\/code> cuando se presiona.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u00c1mbito de los proveedores<\/h1>\n\n\n\n<p>En Riverpod, los proveedores pueden tener diferentes \u00e1mbitos, lo que significa que pueden estar disponibles en diferentes lugares de tu aplicaci\u00f3n. Hay tres \u00e1mbitos principales de proveedores en Riverpod:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Global: los proveedores globales est\u00e1n disponibles en toda tu aplicaci\u00f3n. Pueden ser accedidos por cualquier widget en cualquier lugar de tu aplicaci\u00f3n.<\/li>\n\n\n\n<li>Local: los proveedores locales est\u00e1n disponibles en un \u00e1rbol de widgets espec\u00edfico. Solo pueden ser accedidos por widgets dentro de ese \u00e1rbol de widgets.<\/li>\n\n\n\n<li>Scoped: los proveedores de \u00e1mbito est\u00e1n disponibles en un \u00e1rbol de widgets espec\u00edfico y se pueden utilizar para pasar datos a trav\u00e9s de ese \u00e1rbol de widgets.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Proveedores globales<\/h2>\n\n\n\n<p>Para crear un proveedor global en Riverpod, simplemente lo defines fuera de cualquier widget:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-0ba565d5\"><code lang=\"dart\" class=\"language-dart\"><code>final greetingProvider = Provider((_) =&gt; 'Hello, world!');\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>greetingProvider<\/code> es un proveedor global que est\u00e1 disponible en toda la aplicaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proveedores locales<\/h2>\n\n\n\n<p>Para crear un proveedor local en Riverpod, lo defines dentro de un widget que es el padre del \u00e1rbol de widgets donde quieres utilizar el proveedor:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-d062c06f\"><code lang=\"dart\" class=\"language-dart\"><code>class MyWidget extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return ProviderScope(\n      child: ChildWidget(),\n      overrides: [\n        greetingProvider.overrideWithValue('Hello, Riverpod!'),\n      ],\n    );\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>MyWidget<\/code> es un widget que define un \u00e1mbito local para el proveedor <code>greetingProvider<\/code>. El widget <code>MyWidget<\/code> utiliza <code>ProviderScope<\/code> para crear un \u00e1mbito local y proporciona una lista de <code>overrides<\/code> que pueden anular el valor del proveedor global <code>greetingProvider<\/code> dentro de ese \u00e1mbito local.<\/p>\n\n\n\n<p>En este caso, el valor del proveedor <code>greetingProvider<\/code> se anula con el valor <code>\"Hello, Riverpod!\"<\/code>, que es el nuevo valor que se utilizar\u00e1 dentro de <code>ChildWidget<\/code> y todos sus descendientes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proveedores de \u00e1mbito<\/h2>\n\n\n\n<p>Los proveedores de \u00e1mbito son \u00fatiles cuando necesitas pasar datos a trav\u00e9s de un \u00e1rbol de widgets espec\u00edfico. Por ejemplo, puedes utilizar un proveedor de \u00e1mbito para pasar datos de autenticaci\u00f3n a trav\u00e9s de un \u00e1rbol de widgets que contiene widgets que requieren autenticaci\u00f3n.<\/p>\n\n\n\n<p>Para crear un proveedor de \u00e1mbito en Riverpod, debes crear un nuevo widget que define el proveedor y luego colocar ese widget en el \u00e1rbol de widgets donde quieres utilizar el proveedor:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-44b3d252\"><code lang=\"dart\" class=\"language-dart\"><code>class AuthProvider extends StateNotifier&lt;String&gt; {\n  AuthProvider() : super('');\n\n  void signIn(String token) =&gt; state = token;\n\n  void signOut() =&gt; state = '';\n}\n\nfinal authProvider = StateNotifierProvider((_) =&gt; AuthProvider());\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return ProviderScope(\n      child: MaterialApp(\n        home: ProviderScope(\n          child: AuthWidget(),\n        ),\n      ),\n    );\n  }\n}\n\nclass AuthWidget extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final auth = ref.watch(authProvider);\n    if (auth.state == '') {\n      return SignInWidget();\n    } else {\n      return SignedInWidget();\n    }\n  }\n}\n\nclass SignInWidget extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    return ElevatedButton(\n      onPressed: () =&gt; ref.read(authProvider.notifier).signIn('token'),\n      child: Text('Sign In'),\n    );\n  }\n}\n\nclass SignedInWidget extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final auth = ref.watch(authProvider);\n    return Column(\n      children: [\n        Text('Signed in with token: ${auth.state}'),\n        ElevatedButton(\n          onPressed: () =&gt; ref.read(authProvider.notifier).signOut(),\n          child: Text('Sign Out'),\n        ),\n      ],\n    );\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>AuthProvider<\/code> es un proveedor de \u00e1mbito que se utiliza para mantener el estado de autenticaci\u00f3n de la aplicaci\u00f3n. <code>MyApp<\/code> es el widget principal de la aplicaci\u00f3n que utiliza <code>ProviderScope<\/code> para crear un \u00e1mbito global de proveedores.<\/p>\n\n\n\n<p>Dentro de <code>MyApp<\/code>, <code>ProviderScope<\/code> se utiliza de nuevo para crear un \u00e1mbito de proveedores local que se utiliza para el widget <code>AuthWidget<\/code>. <code>AuthWidget<\/code> es un widget que utiliza <code>ConsumerWidget<\/code> para acceder al proveedor <code>authProvider<\/code> y determinar si el usuario ha iniciado sesi\u00f3n o no.<\/p>\n\n\n\n<p><code>SignInWidget<\/code> es un widget que muestra un bot\u00f3n para iniciar sesi\u00f3n y llama al m\u00e9todo <code>signIn()<\/code> de <code>AuthProvider<\/code> cuando se presiona. <code>SignedInWidget<\/code> es un widget que muestra un mensaje que indica que el usuario ha iniciado sesi\u00f3n y muestra un bot\u00f3n para cerrar sesi\u00f3n.<\/p>\n\n\n\n<p>En este ejemplo, el proveedor de \u00e1mbito <code>authProvider<\/code> se utiliza para pasar datos de autenticaci\u00f3n a trav\u00e9s de un \u00e1rbol de widgets espec\u00edfico que contiene widgets que requieren autenticaci\u00f3n. Al utilizar un proveedor de \u00e1mbito, puedes asegurarte de que los datos de autenticaci\u00f3n s\u00f3lo est\u00e9n disponibles dentro del \u00e1mbito en el que se cre\u00f3 el proveedor. Esto ayuda a prevenir errores y hace que tu c\u00f3digo sea m\u00e1s f\u00e1cil de entender y mantener.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proveedores de futuro (Future Provider)<\/h2>\n\n\n\n<p>Los proveedores de futuro son \u00fatiles cuando necesitas obtener datos asincr\u00f3nicos en tu aplicaci\u00f3n. En lugar de utilizar callbacks o streams para manejar los datos asincr\u00f3nicos, puedes utilizar proveedores de futuro para encapsular los datos y acceder a ellos de manera m\u00e1s f\u00e1cil y consistente.<\/p>\n\n\n\n<p>Para crear un proveedor de futuro en Riverpod, debes utilizar la clase <code>FutureProvider<\/code>. <code>FutureProvider<\/code> toma una funci\u00f3n que devuelve un futuro y utiliza ese futuro para proporcionar el valor del proveedor:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-6c8ed0f0\"><code lang=\"dart\" class=\"language-dart\"><code>final greetingProvider = FutureProvider&lt;String&gt;((ref) async {\n  final response = await http.get(Uri.parse('https:\/\/api.example.com\/greeting'));\n  final body = json.decode(response.body);\n  return body['greeting'];\n});\n\nclass MyWidget extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final greeting = ref.watch(greetingProvider);\n    return Text('Greeting: ${greeting.data}');\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, <code>greetingProvider<\/code> es un proveedor de futuro que utiliza <code>http.get()<\/code> para obtener el valor del saludo desde una API. El valor del proveedor se actualiza autom\u00e1ticamente cuando el futuro se completa.<\/p>\n\n\n\n<p>Dentro de <code>MyWidget<\/code>, se utiliza <code>ConsumerWidget<\/code> para acceder al valor del proveedor <code>greetingProvider<\/code> y mostrarlo en un widget de texto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>Riverpod es una biblioteca de gesti\u00f3n de estado para Flutter que ofrece una gran cantidad de caracter\u00edsticas \u00fatiles, como la capacidad de crear proveedores globales y locales, la capacidad de utilizar datos asincr\u00f3nicos y la capacidad de utilizar la programaci\u00f3n reactiva para actualizar autom\u00e1ticamente tu interfaz de usuario.<\/p>\n\n\n\n<p>En este art\u00edculo, hemos explorado algunos de los conceptos b\u00e1sicos de Riverpod y hemos visto algunos ejemplos simples de c\u00f3mo utilizarlo en tus propias aplicaciones Flutter. Con su capacidad para simplificar el proceso de gesti\u00f3n de estado y hacer que tu c\u00f3digo sea m\u00e1s f\u00e1cil de entender y mantener, Riverpod es definitivamente una biblioteca que vale la pena aprender y utilizar en tus proyectos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos Pr\u00e1cticos<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Autenticaci\u00f3n de usuario<\/h3>\n\n\n\n<p>Supongamos que tienes una aplicaci\u00f3n que requiere que los usuarios inicien sesi\u00f3n antes de poder acceder a ciertas funcionalidades. Puedes utilizar Riverpod para manejar el estado de autenticaci\u00f3n de tu aplicaci\u00f3n de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-047c9d32\"><code lang=\"dart\" class=\"language-dart\"><code>final authServiceProvider = Provider&lt;AuthService&gt;((ref) =&gt; AuthService());\nfinal authStateProvider = StateProvider&lt;AuthState&gt;((ref) =&gt; AuthState.unauthenticated());\n\nclass MyApp extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final authService = ref.watch(authServiceProvider);\n    final authState = ref.watch(authStateProvider);\n\n    return MaterialApp(\n      home: authState.state.when(\n        authenticated: (_) =&gt; HomePage(),\n        unauthenticated: () =&gt; LoginPage(),\n      ),\n    );\n  }\n}\n\nclass LoginPage extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final authService = ref.read(authServiceProvider);\n\n    return Scaffold(\n      body: Center(\n        child: ElevatedButton(\n          onPressed: () async {\n            await authService.login();\n            ref.read(authStateProvider).state = AuthState.authenticated();\n          },\n          child: Text('Login'),\n        ),\n      ),\n    );\n  }\n}\n\nclass HomePage extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final authService = ref.read(authServiceProvider);\n\n    return Scaffold(\n      body: Center(\n        child: ElevatedButton(\n          onPressed: () async {\n            await authService.logout();\n            ref.read(authStateProvider).state = AuthState.unauthenticated();\n          },\n          child: Text('Logout'),\n        ),\n      ),\n    );\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, utilizamos un <code>Provider<\/code> llamado <code>authServiceProvider<\/code> para crear una instancia de <code>AuthService<\/code>, que es una clase que maneja la l\u00f3gica de autenticaci\u00f3n de nuestra aplicaci\u00f3n.<\/p>\n\n\n\n<p>Tambi\u00e9n utilizamos un <code>StateProvider<\/code> llamado <code>authStateProvider<\/code> para manejar el estado de autenticaci\u00f3n de nuestra aplicaci\u00f3n. El estado de autenticaci\u00f3n puede ser \u00abautenticado\u00bb o \u00abno autenticado\u00bb, y lo utilizamos para determinar qu\u00e9 pantalla mostrar al usuario.<\/p>\n\n\n\n<p>En <code>MyApp<\/code>, utilizamos <code>ConsumerWidget<\/code> para mostrar la pantalla correcta al usuario en funci\u00f3n de su estado de autenticaci\u00f3n.<\/p>\n\n\n\n<p>En <code>LoginPage<\/code>, utilizamos <code>ref.read()<\/code> para obtener una instancia de <code>AuthService<\/code> y llamar a su m\u00e9todo <code>login()<\/code>. Despu\u00e9s de que el usuario se autentica correctamente, utilizamos <code>ref.read()<\/code> de nuevo para actualizar el estado de autenticaci\u00f3n de nuestra aplicaci\u00f3n.<\/p>\n\n\n\n<p>En <code>HomePage<\/code>, hacemos lo mismo para manejar el proceso de cierre de sesi\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Tema de la aplicaci\u00f3n<\/h3>\n\n\n\n<p>Supongamos que quieres permitir que el usuario seleccione un tema para tu aplicaci\u00f3n. Puedes utilizar Riverpod para manejar el tema de tu aplicaci\u00f3n de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-4867f2c8\"><code lang=\"dart\" class=\"language-dart\"><code>final themeProvider = StateProvider&lt;ThemeData&gt;((ref) =&gt; ThemeData.light());\n\nclass MyApp extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final theme = ref.watch(themeProvider);\n\n    return MaterialApp(\n      theme: theme.state,\n      home: HomePage(),\n    );\n  }\n}\n\nclass HomePage extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final theme = ref.watch(themeProvider);\n\n    return Scaffold(\n      body: Column(\n        children: [\n          ElevatedButton(\n            onPressed: () =&gt; ref.read(themeProvider).state = ThemeData.light(),<\/code>          ),\n          RaisedButton(\n            child: Text('Light Theme'),\n            onPressed: () =&gt; ref.read(themeProvider).state = ThemeData.light(),\n          ),\n          ElevatedButton(\n            child: Text('Dark Theme'),\n            onPressed: () =&gt; ref.read(themeProvider).state = ThemeData.dark(),\n          ),\n        ],\n      ),\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>En este ejemplo, utilizamos un <code>StateProvider<\/code> llamado <code>themeProvider<\/code> para manejar el tema de nuestra aplicaci\u00f3n. Por defecto, establecemos el tema en <code>ThemeData.light()<\/code>, pero el usuario puede cambiarlo a <code>ThemeData.dark()<\/code> si lo desea.<\/p>\n\n\n\n<p>En <code>MyApp<\/code>, utilizamos <code>ConsumerWidget<\/code> para envolver nuestra aplicaci\u00f3n en un <code>MaterialApp<\/code> y pasar el tema actual a trav\u00e9s de la propiedad <code>theme<\/code>.<\/p>\n\n\n\n<p>En <code>HomePage<\/code>, utilizamos <code>ref.watch()<\/code> para obtener el tema actual y mostrar dos botones que permiten al usuario cambiar el tema de la aplicaci\u00f3n. Cuando el usuario presiona uno de los botones, utilizamos <code>ref.read()<\/code> para actualizar el estado de <code>themeProvider<\/code> y cambiar el tema de la aplicaci\u00f3n en consecuencia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Conexi\u00f3n a una API<\/h3>\n\n\n\n<p>Supongamos que tu aplicaci\u00f3n necesita conectarse a una API para obtener datos. Puedes utilizar Riverpod para manejar la conexi\u00f3n a la API y el estado de carga de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code advgb-dyn-68b54c12\"><code lang=\"dart\" class=\"language-dart\"><code>final apiProvider = Provider&lt;ApiClient&gt;((ref) =&gt; ApiClient());\nfinal apiStateProvider = StateProvider&lt;ApiState&gt;((ref) =&gt; ApiState.loading());\n\nclass MyApp extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final apiState = ref.watch(apiStateProvider);\n\n    return MaterialApp(\n      home: apiState.state.when(\n        loading: () =&gt; LoadingScreen(),\n        success: (data) =&gt; DataScreen(data),\n        error: (errorMessage) =&gt; ErrorScreen(errorMessage),\n      ),\n    );\n  }\n}\n\nclass LoadingScreen extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: CircularProgressIndicator(),\n      ),\n    );\n  }\n}\n\nclass DataScreen extends StatelessWidget {\n  final String data;\n\n  DataScreen(this.data);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: Text(data),\n      ),\n    );\n  }\n}\n\nclass ErrorScreen extends StatelessWidget {\n  final String errorMessage;\n\n  ErrorScreen(this.errorMessage);\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: Text(errorMessage),\n      ),\n    );\n  }\n}\n\nclass ApiState {\n  final String? data;\n  final String? errorMessage;\n\n  ApiState.loading() : data = null, errorMessage = null;\n  ApiState.success(this.data) : errorMessage = null;\n  ApiState.error(this.errorMessage) : data = null;\n}\n\nclass ApiClient {\n  Future&lt;String&gt; fetchData() async {\n    \/\/ L\u00f3gica para obtener datos de la API\n  }\n}\n\nclass ApiConsumer extends ConsumerWidget {\n  @override\n  Widget build(BuildContext context, WidgetRef ref) {\n    final apiState = ref.watch(apiStateProvider);\n    final apiClient = ref.watch(apiProvider);\n\n    if (apiState.state is ApiStateLoading) {\n      apiClient.fetchData().then((data) {\n        ref.read(apiStateProvider).state = ApiState.success(data);\n      }).catchError((error) {\n        ref.read(apiStateProvider).state = ApiState.error(error.toString());\n      });\n    }\n\n    return Container();\n  }\n}\n<\/code><\/code><\/pre>\n\n\n\n<p>En este ejemplo, utilizamos un <code>Provider<\/code> llamado <code>apiProvider<\/code> para crear una instancia de `ApiClient y un <code>StateProvider<\/code> llamado <code>apiStateProvider<\/code> para manejar el estado de carga de la API. Por defecto, establecemos el estado en <code>ApiState.loading()<\/code>.<\/p>\n\n\n\n<p>En <code>MyApp<\/code>, utilizamos <code>ConsumerWidget<\/code> para envolver nuestra aplicaci\u00f3n en un <code>MaterialApp<\/code> y mostrar diferentes pantallas seg\u00fan el estado actual de la API.<\/p>\n\n\n\n<p>En <code>LoadingScreen<\/code>, mostramos un indicador de progreso mientras se cargan los datos.<\/p>\n\n\n\n<p>En <code>DataScreen<\/code>, mostramos los datos obtenidos de la API.<\/p>\n\n\n\n<p>En <code>ErrorScreen<\/code>, mostramos un mensaje de error si se produce un error al obtener los datos.<\/p>\n\n\n\n<p><code>ApiState<\/code> es una clase que utilizamos para manejar el estado de la API. Tiene tres posibles estados: <code>loading<\/code>, <code>success<\/code> y <code>error<\/code>.<\/p>\n\n\n\n<p><code>ApiClient<\/code> es una clase que utilizamos para conectarnos a la API y obtener los datos. En este ejemplo, utilizamos un m\u00e9todo llamado <code>fetchData()<\/code> para obtener los datos de la API. Este m\u00e9todo devuelve una <code>Future&lt;String&gt;<\/code> que contiene los datos obtenidos.<\/p>\n\n\n\n<p><code>ApiConsumer<\/code> es un <code>ConsumerWidget<\/code> que utilizamos para conectarnos a la API y actualizar el estado de <code>apiStateProvider<\/code>. En este ejemplo, utilizamos <code>ref.watch()<\/code> para obtener el estado actual de <code>apiStateProvider<\/code> y <code>apiProvider<\/code>. Si el estado actual es <code>ApiState.loading()<\/code>, llamamos a <code>apiClient.fetchData()<\/code> para obtener los datos de la API. Si se obtienen los datos correctamente, actualizamos el estado de <code>apiStateProvider<\/code> a <code>ApiState.success(data)<\/code>. Si se produce un error, actualizamos el estado de <code>apiStateProvider<\/code> a <code>ApiState.error(error.toString())<\/code>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>En resumen, Riverpod es una biblioteca de gesti\u00f3n de estado para Flutter que permite manejar de manera eficiente el estado de la aplicaci\u00f3n, independientemente del tama\u00f1o o complejidad de la misma. Con Riverpod, puedes crear proveedores para manejar el estado de la aplicaci\u00f3n, conectar componentes a esos proveedores con <code>ConsumerWidget<\/code> y <code>Consumer<\/code>, y manejar cambios de estado de manera reactiva y eficiente. Adem\u00e1s, Riverpod tambi\u00e9n proporciona una serie de caracter\u00edsticas avanzadas, como proveedores diferidos, proveedores de futuro y proveedores de estado condicionales, para ayudar a simplificar la gesti\u00f3n del estado de la aplicaci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"266\" src=\"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-1024x266.png\" alt=\"\" class=\"wp-image-945\" srcset=\"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-1024x266.png 1024w, https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-300x78.png 300w, https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-768x200.png 768w, https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-830x216.png 830w, https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-230x60.png 230w, https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png 1142w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Copyright \u00a9 2023 Remi Rousselet.<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referencias<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/pub.dev\/packages\/flutter_riverpod\" target=\"_blank\" rel=\"noreferrer noopener\">Flutter Riverpod Oficial<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/riverpod.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">P\u00e1gina Oficial<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/itnext.io\/a-minimalist-guide-to-riverpod-4eb24b3386a1\" target=\"_blank\" rel=\"noreferrer noopener\">Otra Gu\u00eda sobre Riverpod<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/7ret.com\/index.php\/2023\/03\/16\/comparacion-entre-getx-y-riverpod-en-flutter-ejemplos-de-uso-en-view-y-controller\/\" target=\"_blank\" rel=\"noreferrer noopener\">Riverpod vs GetX<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n a Riverpod Riverpod es una biblioteca de gesti\u00f3n de estado para Flutter. Es una alternativa a otras bibliotecas populares como Provider, que proporciona una manera simple y eficiente de administrar y compartir el estado entre los widgets en tu aplicaci\u00f3n. Riverpod est\u00e1 dise\u00f1ado para ser f\u00e1cil de usar y entender, y se basa en<\/p>\n<div class=\"blog-grid-button\"><a class href=\"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/\">Seguir leyendo <i class=\"fa fa-arrow-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":945,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","footnotes":""},"categories":[29,28,27],"tags":[],"class_list":["post-944","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dart","category-flutter","category-programacion"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod. - 7ret Software<\/title>\n<meta name=\"description\" content=\"Descubre c\u00f3mo utilizar Riverpod, la biblioteca de gesti\u00f3n de estado para Flutter, para manejar el estado de tu aplicaci\u00f3n de manera eficiente\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod. - 7ret Software\" \/>\n<meta property=\"og:description\" content=\"Descubre c\u00f3mo utilizar Riverpod, la biblioteca de gesti\u00f3n de estado para Flutter, para manejar el estado de tu aplicaci\u00f3n de manera eficiente\" \/>\n<meta property=\"og:url\" content=\"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/\" \/>\n<meta property=\"og:site_name\" content=\"7ret Software\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-10T00:58:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-03-16T00:29:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1142\" \/>\n\t<meta property=\"og:image:height\" content=\"297\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"C. H.\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"C. H.\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/\"},\"author\":{\"name\":\"C. H.\",\"@id\":\"https:\\\/\\\/7ret.com\\\/#\\\/schema\\\/person\\\/4f2f34d251d2dddd28ee25a2284b544b\"},\"headline\":\"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod.\",\"datePublished\":\"2023-03-10T00:58:26+00:00\",\"dateModified\":\"2023-03-16T00:29:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/\"},\"wordCount\":2096,\"image\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/7ret.com\\\/wp-content\\\/uploads\\\/2023\\\/03\\\/riverpod.png\",\"articleSection\":[\"DART\",\"FLUTTER\",\"PROGRAMACI\u00d3N\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/\",\"url\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/\",\"name\":\"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod. - 7ret Software\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/7ret.com\\\/wp-content\\\/uploads\\\/2023\\\/03\\\/riverpod.png\",\"datePublished\":\"2023-03-10T00:58:26+00:00\",\"dateModified\":\"2023-03-16T00:29:34+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/#\\\/schema\\\/person\\\/4f2f34d251d2dddd28ee25a2284b544b\"},\"description\":\"Descubre c\u00f3mo utilizar Riverpod, la biblioteca de gesti\u00f3n de estado para Flutter, para manejar el estado de tu aplicaci\u00f3n de manera eficiente\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#primaryimage\",\"url\":\"https:\\\/\\\/7ret.com\\\/wp-content\\\/uploads\\\/2023\\\/03\\\/riverpod.png\",\"contentUrl\":\"https:\\\/\\\/7ret.com\\\/wp-content\\\/uploads\\\/2023\\\/03\\\/riverpod.png\",\"width\":1142,\"height\":297},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/2023\\\/03\\\/10\\\/flutter-riverpod-gestion-eficiente-del-estado\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/7ret.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/7ret.com\\\/#website\",\"url\":\"https:\\\/\\\/7ret.com\\\/\",\"name\":\"7ret Software\",\"description\":\"The Art of Coding\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/7ret.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/7ret.com\\\/#\\\/schema\\\/person\\\/4f2f34d251d2dddd28ee25a2284b544b\",\"name\":\"C. H.\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/041de218780f503733e8242a74c574b2f6d42b2948097e31e9ff72144d69bfa0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/041de218780f503733e8242a74c574b2f6d42b2948097e31e9ff72144d69bfa0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/041de218780f503733e8242a74c574b2f6d42b2948097e31e9ff72144d69bfa0?s=96&d=mm&r=g\",\"caption\":\"C. H.\"},\"url\":\"https:\\\/\\\/7ret.com\\\/index.php\\\/author\\\/cesar7retadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod. - 7ret Software","description":"Descubre c\u00f3mo utilizar Riverpod, la biblioteca de gesti\u00f3n de estado para Flutter, para manejar el estado de tu aplicaci\u00f3n de manera eficiente","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/","og_locale":"es_ES","og_type":"article","og_title":"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod. - 7ret Software","og_description":"Descubre c\u00f3mo utilizar Riverpod, la biblioteca de gesti\u00f3n de estado para Flutter, para manejar el estado de tu aplicaci\u00f3n de manera eficiente","og_url":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/","og_site_name":"7ret Software","article_published_time":"2023-03-10T00:58:26+00:00","article_modified_time":"2023-03-16T00:29:34+00:00","og_image":[{"width":1142,"height":297,"url":"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png","type":"image\/png"}],"author":"C. H.","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"C. H.","Tiempo de lectura":"15 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#article","isPartOf":{"@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/"},"author":{"name":"C. H.","@id":"https:\/\/7ret.com\/#\/schema\/person\/4f2f34d251d2dddd28ee25a2284b544b"},"headline":"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod.","datePublished":"2023-03-10T00:58:26+00:00","dateModified":"2023-03-16T00:29:34+00:00","mainEntityOfPage":{"@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/"},"wordCount":2096,"image":{"@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#primaryimage"},"thumbnailUrl":"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png","articleSection":["DART","FLUTTER","PROGRAMACI\u00d3N"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/","url":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/","name":"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod. - 7ret Software","isPartOf":{"@id":"https:\/\/7ret.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#primaryimage"},"image":{"@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#primaryimage"},"thumbnailUrl":"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png","datePublished":"2023-03-10T00:58:26+00:00","dateModified":"2023-03-16T00:29:34+00:00","author":{"@id":"https:\/\/7ret.com\/#\/schema\/person\/4f2f34d251d2dddd28ee25a2284b544b"},"description":"Descubre c\u00f3mo utilizar Riverpod, la biblioteca de gesti\u00f3n de estado para Flutter, para manejar el estado de tu aplicaci\u00f3n de manera eficiente","breadcrumb":{"@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#primaryimage","url":"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png","contentUrl":"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod.png","width":1142,"height":297},{"@type":"BreadcrumbList","@id":"https:\/\/7ret.com\/index.php\/2023\/03\/10\/flutter-riverpod-gestion-eficiente-del-estado\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/7ret.com\/"},{"@type":"ListItem","position":2,"name":"Gesti\u00f3n Eficiente del Estado en Flutter con Riverpod."}]},{"@type":"WebSite","@id":"https:\/\/7ret.com\/#website","url":"https:\/\/7ret.com\/","name":"7ret Software","description":"The Art of Coding","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/7ret.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/7ret.com\/#\/schema\/person\/4f2f34d251d2dddd28ee25a2284b544b","name":"C. H.","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/041de218780f503733e8242a74c574b2f6d42b2948097e31e9ff72144d69bfa0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/041de218780f503733e8242a74c574b2f6d42b2948097e31e9ff72144d69bfa0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/041de218780f503733e8242a74c574b2f6d42b2948097e31e9ff72144d69bfa0?s=96&d=mm&r=g","caption":"C. H."},"url":"https:\/\/7ret.com\/index.php\/author\/cesar7retadmin\/"}]}},"author_meta":{"display_name":"C. H.","author_link":"https:\/\/7ret.com\/index.php\/author\/cesar7retadmin\/"},"featured_img":"https:\/\/7ret.com\/wp-content\/uploads\/2023\/03\/riverpod-300x78.png","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/7ret.com\/index.php\/category\/programacion\/dart\/\" class=\"advgb-post-tax-term\">DART<\/a>","<a href=\"https:\/\/7ret.com\/index.php\/category\/programacion\/flutter\/\" class=\"advgb-post-tax-term\">FLUTTER<\/a>","<a href=\"https:\/\/7ret.com\/index.php\/category\/programacion\/\" class=\"advgb-post-tax-term\">PROGRAMACI\u00d3N<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">DART<\/span>","<span class=\"advgb-post-tax-term\">FLUTTER<\/span>","<span class=\"advgb-post-tax-term\">PROGRAMACI\u00d3N<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Publicado 4 a\u00f1os hace","modified":"Actualizado 4 a\u00f1os hace"},"absolute_dates":{"created":"Publicado el 10 marzo, 2023","modified":"Actualizado el 16 marzo, 2023"},"absolute_dates_time":{"created":"Publicado el 10 marzo, 2023 1:58 am","modified":"Actualizado el 16 marzo, 2023 1:29 am"},"featured_img_caption":"","series_order":"","_links":{"self":[{"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/posts\/944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/comments?post=944"}],"version-history":[{"count":1,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/posts\/944\/revisions"}],"predecessor-version":[{"id":975,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/posts\/944\/revisions\/975"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/media\/945"}],"wp:attachment":[{"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/media?parent=944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/categories?post=944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/7ret.com\/index.php\/wp-json\/wp\/v2\/tags?post=944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}