{"id":21790,"date":"2025-02-18T09:00:00","date_gmt":"2025-02-18T08:00:00","guid":{"rendered":"https:\/\/carontestudio.com\/blog\/?p=21790"},"modified":"2025-10-23T10:07:07","modified_gmt":"2025-10-23T08:07:07","slug":"crear-app-con-flutter-guia-basica-2","status":"publish","type":"post","link":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/","title":{"rendered":"C\u00f3mo crear tu primera App con Flutter: Gu\u00eda b\u00e1sica 2"},"content":{"rendered":"\n<p>En el anterior art\u00edculo, aprendimos a crear nuestra primera aplicaci\u00f3n b\u00e1sica en Flutter. En este, profundizaremos un poco m\u00e1s, veremos conceptos como la navegaci\u00f3n entre pantallas, mostrar informaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet. \u00a1Comenzamos!<\/p>\n\n\n\n<p>Si no has le\u00eddo la primera parte de esta serie de art\u00edculos, haz clic en la siguiente imagen.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"604\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/portada-flutter-1024x604.jpg\" alt=\"C\u00f3mo crear tu primera App con Flutter: Gu\u00eda b\u00e1sica 1\" class=\"wp-image-21748\" style=\"width:465px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/portada-flutter-1024x604.jpg 1024w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/portada-flutter-300x177.jpg 300w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/portada-flutter-768x453.jpg 768w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/portada-flutter.jpg 1250w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Widgets en Flutter<\/h2>\n\n\n\n<p>Como adelantamos en el art\u00edculo anterior, los widgets son bloques de construcci\u00f3n fundamentales en Flutter. Todo es un widget en Flutter. Tenemos varios tipos, \u00a1vamos a verlos!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Inherited widgets<\/h3>\n\n\n\n<p>Los inherited widgets, nos permiten compartir datos a trav\u00e9s del \u00e1rbol de widgets. Son muy \u00fatiles para la gesti\u00f3n de estados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ThemeData extends InheritedWidget {\n  final Color primaryColor;\n  \n  ThemeData({\n    required this.primaryColor,\n    required Widget child\n  }) : super(child: child);\n  \n  static ThemeData of(BuildContext context) {\n    return context.dependOnInheritedWidgetOfExactType&lt;ThemeData&gt;()!;\n  }\n  \n  @override\n  bool updateShouldNotify(ThemeData oldWidget) {\n    return primaryColor != oldWidget.primaryColor;\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Stateless widgets<\/h3>\n\n\n\n<p>Son widgets inmutables, lo que significa que sus propiedades no pueden cambiar durante su vida \u00fatil. Son perfectos para partes de la interfaz que no necesitan mantener un estado, como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class WelcomeText extends StatelessWidget {\n  final String name;\n  \n  WelcomeText({required this.name});\n  \n  @override\n  Widget build(BuildContext context) {\n    return Text('\u00a1Bienvenido $name!');\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Stateful widgets<\/h3>\n\n\n\n<p>Estos widgets pueden mantener un estado que puede cambiar durante el tiempo de vida del widget. Son \u00fatiles para componentes interactivos como un contador.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Counter extends StatefulWidget {\n  @override\n  _CounterState createState() =&gt; _CounterState();\n}\n\nclass _CounterState extends State&lt;Counter&gt; {\n  int count = 0;\n  \n  @override\n  Widget build(BuildContext context) {\n    return Column(\n      children: &#91;\n        Text('Contador: $count'),\n        ElevatedButton(\n          onPressed: () =&gt; setState(() =&gt; count++),\n          child: Text('Incrementar')\n        )\n      ]\n    );\n  }\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"486\" height=\"886\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/containeresilizado.png\" alt=\"C\u00f3mo crear tu primera App con Flutter: Styled widgets\" class=\"wp-image-21991\" style=\"width:319px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/containeresilizado.png 486w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/containeresilizado-165x300.png 165w\" sizes=\"auto, (max-width: 486px) 100vw, 486px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Styled widgets<\/h3>\n\n\n\n<p>Son widgets que te permiten personalizar la apariencia de tus componentes. Por ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Container (para decoraci\u00f3n y padding)<\/li>\n\n\n\n<li>DecoratedBox<\/li>\n\n\n\n<li>Transform<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>Container(\n  decoration: BoxDecoration(\n    color: Colors.blue,\n    borderRadius: BorderRadius.circular(8),\n    boxShadow: &#91;\n      BoxShadow(\n        color: Colors.black26,\n        offset: Offset(0, 2),\n        blurRadius: 6\n      )\n    ]\n  ),\n  padding: EdgeInsets.all(16),\n  child: Text('Widget Estilizado')\n)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Material widgets<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"471\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/materialdesign-1024x471.jpg\" alt=\"C\u00f3mo crear tu primera App con Flutter: Material Design\" class=\"wp-image-21892\" style=\"width:487px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/materialdesign-1024x471.jpg 1024w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/materialdesign-300x138.jpg 300w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/materialdesign-768x353.jpg 768w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/materialdesign.jpg 1520w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Son widgets que implementan el dise\u00f1o Material Design de Google. Incluyen componentes como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AppBar<\/li>\n\n\n\n<li>FloatingActionButton<\/li>\n\n\n\n<li>Card<\/li>\n\n\n\n<li>Drawer<\/li>\n<\/ul>\n\n\n\n<div style=\"height:36px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"855\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/cupertino-1024x855.jpg\" alt=\"C\u00f3mo crear tu primera App con Flutter: Cupertino Widgets\" class=\"wp-image-21887\" style=\"width:341px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/cupertino-1024x855.jpg 1024w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/cupertino-300x251.jpg 300w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/cupertino-768x642.jpg 768w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/cupertino.jpg 1142w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Cupertino widgets<\/h3>\n\n\n\n<p>Los <a href=\"https:\/\/docs.flutter.dev\/ui\/widgets\/cupertino\" target=\"_blank\" rel=\"noreferrer noopener\">Cupertino<\/a> son widgets que siguen las gu\u00edas de dise\u00f1o de iOS. Incluyen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CupertinoNavigationBar<\/li>\n\n\n\n<li>CupertinoButton<\/li>\n\n\n\n<li>CupertinoActionSheet<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Navegaci\u00f3n entre pantallas<\/h2>\n\n\n\n<p>La navegaci\u00f3n es uno de los conceptos m\u00e1s importantes en el desarrollo de aplicaciones m\u00f3viles. En Flutter, podemos manejar la navegaci\u00f3n de forma sencilla utilizando el widget Navigator. Veamos paso a paso c\u00f3mo implementar diferentes tipos de navegaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Crear m\u00faltiples pantallas<\/h3>\n\n\n\n<p>Primero, necesitamos crear diferentes pantallas para navegar entre ellas. Cada pantalla ser\u00e1 una clase que extiende de StatelessWidget o StatefulWidget.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ home_screen.dart\nclass HomeScreen extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Inicio'),\n      ),\n      body: Center(\n        child: ElevatedButton(\n          onPressed: () {\n            \/\/ Aqu\u00ed implementaremos la navegaci\u00f3n\n          },\n          child: Text('Ir a detalles'),\n        ),\n      ),\n    );\n  }\n}\n\n\/\/ details_screen.dart\nclass DetailsScreen extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Detalles'),\n      ),\n      body: Center(\n        child: Text('Pantalla de detalles'),\n      ),\n    );\n  }\n}<\/code><\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"964\" height=\"886\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/primerafase-1.png\" alt=\"C\u00f3mo crear tu primera App con Flutter: Navegaci\u00f3n\" class=\"wp-image-21999\" style=\"width:620px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/primerafase-1.png 964w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/primerafase-1-300x276.png 300w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/primerafase-1-768x706.png 768w\" sizes=\"auto, (max-width: 964px) 100vw, 964px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Navegaci\u00f3n b\u00e1sica en Flutter (push y pop)<\/h3>\n\n\n\n<p>Flutter utiliza un sistema de navegaci\u00f3n basado en pila (stack). Las operaciones b\u00e1sicas son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>push<\/code>: a\u00f1ade una nueva pantalla encima de la actual<\/li>\n\n\n\n<li><code>pop<\/code>: regresa a la pantalla anterior<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Navegaci\u00f3n hacia adelante (push)\nElevatedButton(\n  onPressed: () {\n    Navigator.push(\n      context,\n      MaterialPageRoute(builder: (context) =&gt; DetailsScreen()),\n    );\n  },\n  child: Text('Ir a detalles'),\n);\n\n\/\/ Navegaci\u00f3n hacia atr\u00e1s (pop)\nElevatedButton(\n  onPressed: () {\n    Navigator.pop(context);\n  },\n  child: Text('Volver'),\n);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Pasar datos entre pantallas<\/h3>\n\n\n\n<p>Es com\u00fan necesitar pasar datos de una pantalla a otra. Podemos hacerlo a trav\u00e9s del constructor de la pantalla a la que pasamos informaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ details_screen.dart con par\u00e1metros\nclass DetailsScreen extends StatelessWidget {\n  final String title;\n  final String description;\n\n  const DetailsScreen({\n    required this.title,\n    required this.description,\n  });\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(title),\n      ),\n      body: Center(\n        child: Text(description),\n      ),\n    );\n  }\n}\n\n\/\/ Navegaci\u00f3n con paso de datos\nElevatedButton(\n  onPressed: () {\n    Navigator.push(\n      context,\n      MaterialPageRoute(\n        builder: (context) =&gt; DetailsScreen(\n          title: 'Mi t\u00edtulo',\n          description: 'Esta es la descripci\u00f3n',\n        ),\n      ),\n    );\n  },\n  child: Text('Ver detalles'),\n);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Bottom Navigation Bar<\/h3>\n\n\n\n<p>Una forma com\u00fan de navegaci\u00f3n en aplicaciones m\u00f3viles es usar una barra de navegaci\u00f3n inferior.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"482\" height=\"886\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/bottomnavigation.png\" alt=\"C\u00f3mo crear tu primera App con Flutter: Bottom navigation bar\" class=\"wp-image-22002\" style=\"width:344px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/bottomnavigation.png 482w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/bottomnavigation-163x300.png 163w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n<\/div>\n\n\n<pre class=\"wp-block-code\"><code>class MainScreen extends StatefulWidget {\n  @override\n  _MainScreenState createState() =&gt; _MainScreenState();\n}\n\nclass _MainScreenState extends State&lt;MainScreen&gt; {\n  int _selectedIndex = 0;\n  \n  static const List&lt;Widget&gt; _screens = &lt;Widget&gt;&#91;\n    HomeScreen(),\n    SearchScreen(),\n    ProfileScreen(),\n  ];\n\n  void _onItemTapped(int index) {\n    setState(() {\n      _selectedIndex = index;\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Center(\n        child: _screens.elementAt(_selectedIndex),\n      ),\n      bottomNavigationBar: BottomNavigationBar(\n        items: const &lt;BottomNavigationBarItem&gt;&#91;\n          BottomNavigationBarItem(\n            icon: Icon(Icons.home),\n            label: 'Inicio',\n          ),\n          BottomNavigationBarItem(\n            icon: Icon(Icons.search),\n            label: 'Buscar',\n          ),\n          BottomNavigationBarItem(\n            icon: Icon(Icons.person),\n            label: 'Perfil',\n          ),\n        ],\n        currentIndex: _selectedIndex,\n        onTap: _onItemTapped,\n      ),\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Puntos importantes<\/h3>\n\n\n\n<p><strong>Manejo del bot\u00f3n atr\u00e1s<\/strong>: Flutter maneja autom\u00e1ticamente el bot\u00f3n atr\u00e1s en Android cuando usas Navigator.push().<\/p>\n\n\n\n<p>R<strong>utas con nombre<\/strong>: Para aplicaciones m\u00e1s grandes, podemos usar rutas con nombre para facilitarnos la navegaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ En MaterialApp\nMaterialApp(\n  initialRoute: '\/',\n  routes: {\n    '\/': (context) =&gt; HomeScreen(),\n    '\/details': (context) =&gt; DetailsScreen(),\n    '\/profile': (context) =&gt; ProfileScreen(),\n  },\n);\n\n\/\/ Navegar usando rutas con nombre\nNavigator.pushNamed(context, '\/details');<\/code><\/pre>\n\n\n\n<p><strong>Navegaci\u00f3n con resultado<\/strong>: Puedes esperar un resultado cuando regresas de una pantalla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Navegar y esperar resultado\nfinal result = await Navigator.push(\n  context,\n  MaterialPageRoute(builder: (context) =&gt; SelectionScreen()),\n);\n\n\/\/ En la pantalla de selecci\u00f3n\nNavigator.pop(context, 'Resultado seleccionado');<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mostrar datos en tu aplicaci\u00f3n Flutter<\/h2>\n\n\n\n<p>Flutter ofrece varias formas de mostrar datos de manera eficiente y atractiva, estas son las m\u00e1s comunes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ListView<\/h3>\n\n\n\n<p>ListView es el widget m\u00e1s com\u00fan para mostrar listas. Tiene varias formas de implementaci\u00f3n:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"482\" height=\"886\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/listaprod.png\" alt=\"C\u00f3mo crear tu primera App con Flutter: Lista de productos\" class=\"wp-image-22004\" style=\"width:336px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/listaprod.png 482w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/listaprod-163x300.png 163w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n<\/div>\n\n\n<p><strong>ListView.builder<\/strong>: Ideal para listas largas o infinitas, ya que construye los elementos solo cuando son visibles.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class ProductList extends StatelessWidget {\n  final List&lt;Product&gt; products = &#91;\n    Product(name: 'Laptop', price: 999.99),\n    Product(name: 'Mouse', price: 29.99),\n    Product(name: 'Teclado', price: 59.99),\n    \/\/ ... m\u00e1s productos\n  ];\n\n  @override\n  Widget build(BuildContext context) {\n    return ListView.builder(\n      itemCount: products.length,\n      itemBuilder: (context, index) {\n        return ListTile(\n          leading: Icon(Icons.shopping_bag),\n          title: Text(products&#91;index].name),\n          subtitle: Text('\\$${products&#91;index].price}'),\n          trailing: Icon(Icons.arrow_forward_ios),\n          onTap: () {\n            \/\/ Manejar el tap\n          },\n        );\n      },\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p><strong>ListView.separated:<\/strong> Similar a ListView.builder, pero permite a\u00f1adir un separador entre elementos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ListView.separated(\n  itemCount: products.length,\n  separatorBuilder: (context, index) =&gt; Divider(\n    color: Colors.grey&#91;300],\n    height: 1,\n  ),\n  itemBuilder: (context, index) {\n    return ListTile(\n      title: Text(products&#91;index].name),\n      subtitle: Text('\\$${products&#91;index].price}'),\n    );\n  },\n);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">GridView<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"482\" height=\"886\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/productosgrid.png\" alt=\"Grid de productos\" class=\"wp-image-22008\" style=\"width:297px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/productosgrid.png 482w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/productosgrid-163x300.png 163w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n<\/div>\n\n\n<p>GridView organiza los elementos en una cuadr\u00edcula. Es perfecto para galer\u00edas de im\u00e1genes o cat\u00e1logos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GridView.builder(\n  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(\n    crossAxisCount: 2,  \/\/ N\u00famero de columnas\n    crossAxisSpacing: 10.0,  \/\/ Espacio horizontal entre items\n    mainAxisSpacing: 10.0,   \/\/ Espacio vertical entre items\n    childAspectRatio: 1.0,   \/\/ Relaci\u00f3n de aspecto de cada item\n  ),\n  padding: EdgeInsets.all(10.0),\n  itemCount: products.length,\n  itemBuilder: (context, index) {\n    return Card(\n      child: Column(\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: &#91;\n          Image.network(products&#91;index].imageUrl, height: 100),\n          SizedBox(height: 8),\n          Text(products&#91;index].name),\n          Text('\\$${products&#91;index].price}'),\n        ],\n      ),\n    );\n  },\n);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Otras maneras de mostrar informaci\u00f3n en Flutter<\/h3>\n\n\n\n<p>Tambi\u00e9n podemos mostrar informaci\u00f3n en diferentes elementos o widgets como tarjetas. Puedes verlas todas en el<a href=\"https:\/\/docs.flutter.dev\/ui\/widgets\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> cat\u00e1logo de widgets de Flutter.<\/a><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"482\" height=\"886\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/tarjetitas-1.png\" alt=\"Tarjetas en grid\" class=\"wp-image-22013\" style=\"width:314px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/tarjetitas-1.png 482w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/tarjetitas-1-163x300.png 163w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/figure>\n<\/div>\n\n\n<pre class=\"wp-block-code\"><code>Card(\n  child: Container(\n    padding: EdgeInsets.all(16.0),\n    child: Column(\n      crossAxisAlignment: CrossAxisAlignment.start,\n      children: &#91;\n        Image.network(\n          product.imageUrl,\n          height: 200,\n          width: double.infinity,\n          fit: BoxFit.cover,\n        ),\n        Padding(\n          padding: EdgeInsets.all(8.0),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: &#91;\n              Text(\n                product.name,\n                style: TextStyle(\n                  fontSize: 18,\n                  fontWeight: FontWeight.bold,\n                ),\n              ),\n              SizedBox(height: 8),\n              Text(\n                '\\$${product.price}',\n                style: TextStyle(\n                  color: Colors.green,\n                  fontSize: 16,\n                ),\n              ),\n            ],\n          ),\n        ),\n      ],\n    ),\n  ),\n);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Animaciones B\u00e1sicas en tu app Flutter<\/h2>\n\n\n\n<p>Flutter ofrece varias formas sencillas de a\u00f1adir animaciones a tu app. Recomendamos mirar el <a href=\"https:\/\/flutter.github.io\/samples\/web\/animations\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">cat\u00e1logo de animaciones de Flutter<\/a>, donde podr\u00e1s ver c\u00f3mo funciona cada una de ellas de manera muy visual.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Animaciones impl\u00edcitas<\/h3>\n\n\n\n<p>Las animaciones impl\u00edcitas son la forma m\u00e1s sencilla de animar widgets en Flutter. El framework se encarga autom\u00e1ticamente de la animaci\u00f3n cuando cambias ciertos valores. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>child: AnimatedContainer(\n        duration: Duration(milliseconds: 300),\n        width: _isExpanded ? 200.0 : 100.0,\n        height: _isExpanded ? 200.0 : 100.0,\n        color: _isExpanded ? Colors.blue : Colors.red,\n        curve: Curves.easeInOut,\n        child: Center(\n          child: Text(\n            'Haz click aqu\u00ed',\n            style: TextStyle(color: Colors.white),\n          ),\n        ),\n      ),<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Efectos de transici\u00f3n<\/h3>\n\n\n\n<p>Las animaciones Hero son perfectas para transiciones entre pantallas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ En la primera pantalla\nHero(\n  tag: 'imageHero',\n  child: Image.network(\n    'url_de_la_imagen',\n    height: 100,\n  ),\n)\n\n\/\/ En la pantalla de destino\nHero(\n  tag: 'imageHero',\n  child: Image.network(\n    'url_de_la_imagen',\n    height: 300,\n  ),\n)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Animaciones de loading<\/h3>\n\n\n\n<p>Puedes a\u00f1adir una animaci\u00f3n para cuando la aplicaci\u00f3n est\u00e1 cargando, de esta manera mejorar\u00e1s la experiencia del usuario.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conexi\u00f3n a Internet desde una app Flutter<\/h2>\n\n\n\n<p>La conectividad a internet es una parte fundamental de casi cualquier aplicaci\u00f3n m\u00f3vil moderna. Flutter proporciona herramientas para manejar las comunicaciones en red de manera eficiente y segura. Veamos los aspectos m\u00e1s importantes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Realizar peticiones HTTP<\/h3>\n\n\n\n<p>Para realizar peticiones HTTP en Flutter, necesitamos utilizar el paquete `http`. Este paquete proporciona una manera sencilla y efectiva de comunicarse con servicios web. Primero, debemos a\u00f1adirlo a nuestro proyecto a trav\u00e9s del archivo pubspec.yaml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dependencies:\n  http: ^1.1.0<\/code><\/pre>\n\n\n\n<p>Las peticiones HTTP son operaciones as\u00edncronas, lo que significa que necesitamos esperar a que se complete la operaci\u00f3n antes de procesar los datos. Flutter maneja esto con el uso de <em>async <\/em>y <em>await<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import 'package:flutter\/material.dart';\nimport 'package:http\/http.dart' as http;\nimport 'dart:convert';\n\nvoid main() =&gt; runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: HomePage(),\n    );\n  }\n}\n\nclass HomePage extends StatefulWidget {\n  @override\n  _HomePageState createState() =&gt; _HomePageState();\n}\n\nclass _HomePageState extends State&lt;HomePage&gt; {\n  String _data = \"Cargando...\";\n\n  \/\/ M\u00e9todo para realizar una petici\u00f3n HTTP GET\n  Future&lt;void&gt; fetchData() async {\n    final url = Uri.parse('https:\/\/jsonplaceholder.typicode.com\/posts\/1');\n    try {\n      final response = await http.get(url);\n\n      if (response.statusCode == 200) {\n        final responseData = json.decode(response.body);\n        setState(() {\n          _data = responseData&#91;'title'];\n        });\n      } else {\n        setState(() {\n          _data = \"Error: ${response.statusCode}\";\n        });\n      }\n    } catch (e) {\n      setState(() {\n        _data = \"Error al conectar: $e\";\n      });\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    fetchData();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Conexi\u00f3n a Internet'),\n      ),\n      body: Center(\n        child: Text(\n          _data,\n          style: TextStyle(fontSize: 18),\n          textAlign: TextAlign.center,\n        ),\n      ),\n    );\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Consumir una API REST simple desde Flutter<\/h3>\n\n\n\n<p>Las APIs REST son la forma m\u00e1s com\u00fan de comunicaci\u00f3n entre aplicaciones m\u00f3viles y servidores. Cuando trabajamos con APIs REST, es una buena pr\u00e1ctica crear modelos que representen nuestros datos. Esto nos ayuda a mantener el c\u00f3digo organizado y seguro.  <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import 'package:flutter\/material.dart';\nimport 'package:http\/http.dart' as http;\nimport 'dart:convert';\n\n\/\/ Modelo para representar los datos\nclass Post {\n  final int id;\n  final String title;\n  final String body;\n\n  Post({required this.id, required this.title, required this.body});\n\n  \/\/ Factory para crear un Post desde un JSON\n  factory Post.fromJson(Map&lt;String, dynamic&gt; json) {\n    return Post(\n      id: json&#91;'id'],\n      title: json&#91;'title'],\n      body: json&#91;'body'],\n    );\n  }\n}\n\nvoid main() =&gt; runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: HomePage(),\n    );\n  }\n}\n\nclass HomePage extends StatefulWidget {\n  @override\n  _HomePageState createState() =&gt; _HomePageState();\n}\n\nclass _HomePageState extends State&lt;HomePage&gt; {\n  late Future&lt;Post&gt; _post;\n\n  \/\/ M\u00e9todo para obtener datos de la API\n  Future&lt;Post&gt; fetchPost() async {\n    final url = Uri.parse('https:\/\/jsonplaceholder.typicode.com\/posts\/1');\n    final response = await http.get(url);\n\n    if (response.statusCode == 200) {\n      return Post.fromJson(json.decode(response.body));\n    } else {\n      throw Exception('Error al cargar los datos');\n    }\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _post = fetchPost();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Consumiendo API REST'),\n      ),\n      body: FutureBuilder&lt;Post&gt;(\n        future: _post,\n        builder: (context, snapshot) {\n          if (snapshot.connectionState == ConnectionState.waiting) {\n            return Center(child: CircularProgressIndicator());\n          } else if (snapshot.hasError) {\n            return Center(child: Text('Error: ${snapshot.error}'));\n          } else if (snapshot.hasData) {\n            final post = snapshot.data!;\n            return Padding(\n              padding: const EdgeInsets.all(16.0),\n              child: Column(\n                crossAxisAlignment: CrossAxisAlignment.start,\n                children: &#91;\n                  Text(\n                    'ID: ${post.id}',\n                    style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),\n                  ),\n                  SizedBox(height: 10),\n                  Text(\n                    'T\u00edtulo: ${post.title}',\n                    style: TextStyle(fontSize: 18),\n                  ),\n                  SizedBox(height: 10),\n                  Text(\n                    'Contenido: ${post.body}',\n                    style: TextStyle(fontSize: 16),\n                  ),\n                ],\n              ),\n            );\n          } else {\n            return Center(child: Text('No se encontraron datos'));\n          }\n        },\n      ),\n    );\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Mostrar datos desde internet<\/h3>\n\n\n\n<p>Cuando trabajamos con datos de internet, debemos considerar que las peticiones pueden tardar y pueden fallar. Flutter proporciona el widget <strong>FutureBuilder <\/strong>espec\u00edficamente para manejar estas situaciones. El <strong>FutureBuilder <\/strong>permite: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mostrar un indicador de carga mientras esperamos los datos<\/li>\n\n\n\n<li>Manejar errores<\/li>\n\n\n\n<li>Actualizar la UI autom\u00e1ticamente cuando llegan los datos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>import 'package:flutter\/material.dart';\nimport 'package:http\/http.dart' as http;\nimport 'dart:convert';\n\n\/\/ Modelo para representar los datos\nclass User {\n  final int id;\n  final String name;\n  final String email;\n\n  User({required this.id, required this.name, required this.email});\n\n  \/\/ Factory para crear un User desde un JSON\n  factory User.fromJson(Map&lt;String, dynamic&gt; json) {\n    return User(\n      id: json&#91;'id'],\n      name: json&#91;'name'],\n      email: json&#91;'email'],\n    );\n  }\n}\n\nvoid main() =&gt; runApp(MyApp());\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: HomePage(),\n    );\n  }\n}\n\nclass HomePage extends StatefulWidget {\n  @override\n  _HomePageState createState() =&gt; _HomePageState();\n}\n\nclass _HomePageState extends State&lt;HomePage&gt; {\n  \/\/ M\u00e9todo para obtener datos desde la API\n  Future&lt;List&lt;User&gt;&gt; fetchUsers() async {\n    final url = Uri.parse('https:\/\/jsonplaceholder.typicode.com\/users');\n    final response = await http.get(url);\n\n    if (response.statusCode == 200) {\n      final List&lt;dynamic&gt; jsonList = json.decode(response.body);\n      return jsonList.map((json) =&gt; User.fromJson(json)).toList();\n    } else {\n      throw Exception('Error al cargar los usuarios');\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text('Mostrar Datos desde Internet'),\n      ),\n      body: FutureBuilder&lt;List&lt;User&gt;&gt;(\n        future: fetchUsers(),\n        builder: (context, snapshot) {\n          if (snapshot.connectionState == ConnectionState.waiting) {\n            \/\/ Indicador de carga\n            return Center(child: CircularProgressIndicator());\n          } else if (snapshot.hasError) {\n            \/\/ Mostrar mensaje de error\n            return Center(child: Text('Error: ${snapshot.error}'));\n          } else if (snapshot.hasData) {\n            \/\/ Mostrar lista de usuarios\n            final users = snapshot.data!;\n            return ListView.builder(\n              itemCount: users.length,\n              itemBuilder: (context, index) {\n                final user = users&#91;index];\n                return ListTile(\n                  leading: CircleAvatar(\n                    child: Text(user.id.toString()),\n                  ),\n                  title: Text(user.name),\n                  subtitle: Text(user.email),\n                );\n              },\n            );\n          } else {\n            \/\/ Mostrar mensaje si no hay datos\n            return Center(child: Text('No se encontraron usuarios'));\n          }\n        },\n      ),\n    );\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u00a1Ya est\u00e1!<\/h2>\n\n\n\n<p>\u00a1Perfecto! Ahora ya puedes incorporar elementos y funcionalidades m\u00e1s interesantes a tu aplicaci\u00f3n Flutter. \u00bfTienes alg\u00fan proyecto Flutter en mente? \u00a1Cu\u00e9ntanos en comentarios!  Pincha en la siguiente imagen para acceder a la \u00faltima parte de este art\u00edculo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/carontestudio.com\/blog\/como-crear-app-con-flutter-guia-basica-3\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"604\" src=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/guiabasica3-1024x604.jpg\" alt=\"C\u00f3mo crear tu primera App con Flutter Gu\u00eda b\u00e1sica 3\" class=\"wp-image-22054\" style=\"width:543px;height:auto\" srcset=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/guiabasica3-1024x604.jpg 1024w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/guiabasica3-300x177.jpg 300w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/guiabasica3-768x453.jpg 768w, https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/guiabasica3.jpg 1250w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.<\/p>\n","protected":false},"author":22,"featured_media":21860,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[50],"tags":[],"class_list":["post-21790","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion-web"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Crea tu primera App con Flutter: Navegaci\u00f3n, Widgets... - Caronte<\/title>\n<meta name=\"description\" content=\"En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Crea tu primera App con Flutter: Navegaci\u00f3n, Widgets... - Caronte\" \/>\n<meta property=\"og:description\" content=\"En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog de maketing | Caronte\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/carontewebstudio\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-18T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-23T08:07:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/flutter21.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1250\" \/>\n\t<meta property=\"og:image:height\" content=\"737\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Irune Guinea\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Irune Guinea\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/\"},\"author\":{\"name\":\"Irune Guinea\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#\\\/schema\\\/person\\\/300ad5e85146a39ec7ea40f21abc8b38\"},\"headline\":\"C\u00f3mo crear tu primera App con Flutter: Gu\u00eda b\u00e1sica 2\",\"datePublished\":\"2025-02-18T08:00:00+00:00\",\"dateModified\":\"2025-10-23T08:07:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/\"},\"wordCount\":980,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/flutter21.jpg\",\"articleSection\":[\"Programaci\u00f3n\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/\",\"url\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/\",\"name\":\"Crea tu primera App con Flutter: Navegaci\u00f3n, Widgets... - Caronte\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/flutter21.jpg\",\"datePublished\":\"2025-02-18T08:00:00+00:00\",\"dateModified\":\"2025-10-23T08:07:07+00:00\",\"description\":\"En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/flutter21.jpg\",\"contentUrl\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/flutter21.jpg\",\"width\":1250,\"height\":737},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/crear-app-con-flutter-guia-basica-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo crear tu primera App con Flutter: Gu\u00eda b\u00e1sica 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/\",\"name\":\"Blog de marketing | Caronte\",\"description\":\"En nuestro blog encontrar\u00e1s art\u00edculos semanales sobre SEO, marketing online, programaci\u00f3n web y mucho m\u00e1s.\",\"publisher\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#organization\",\"name\":\"Caronte - Agencia de marketing\",\"url\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/caronte-agencia-de-marketing-logo.png\",\"contentUrl\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/caronte-agencia-de-marketing-logo.png\",\"width\":1090,\"height\":155,\"caption\":\"Caronte - Agencia de marketing\"},\"image\":{\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/carontewebstudio\\\/\",\"https:\\\/\\\/www.instagram.com\\\/caronte_studio\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@carontewebstudio\",\"https:\\\/\\\/www.youtube.com\\\/@carontewebstudio\",\"https:\\\/\\\/es.linkedin.com\\\/company\\\/carontewebstudio\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/#\\\/schema\\\/person\\\/300ad5e85146a39ec7ea40f21abc8b38\",\"name\":\"Irune Guinea\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3002e85ac73b53aad9f60e3f1b230ffa3c9dcfcf1167b8cc8131a093f97a15da?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3002e85ac73b53aad9f60e3f1b230ffa3c9dcfcf1167b8cc8131a093f97a15da?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3002e85ac73b53aad9f60e3f1b230ffa3c9dcfcf1167b8cc8131a093f97a15da?s=96&d=mm&r=g\",\"caption\":\"Irune Guinea\"},\"url\":\"https:\\\/\\\/carontestudio.com\\\/blog\\\/author\\\/irune\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Crea tu primera App con Flutter: Navegaci\u00f3n, Widgets... - Caronte","description":"En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.","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:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/","og_locale":"es_ES","og_type":"article","og_title":"Crea tu primera App con Flutter: Navegaci\u00f3n, Widgets... - Caronte","og_description":"En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.","og_url":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/","og_site_name":"Blog de maketing | Caronte","article_publisher":"https:\/\/www.facebook.com\/carontewebstudio\/","article_published_time":"2025-02-18T08:00:00+00:00","article_modified_time":"2025-10-23T08:07:07+00:00","og_image":[{"width":1250,"height":737,"url":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/flutter21.jpg","type":"image\/jpeg"}],"author":"Irune Guinea","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Irune Guinea","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#article","isPartOf":{"@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/"},"author":{"name":"Irune Guinea","@id":"https:\/\/carontestudio.com\/blog\/#\/schema\/person\/300ad5e85146a39ec7ea40f21abc8b38"},"headline":"C\u00f3mo crear tu primera App con Flutter: Gu\u00eda b\u00e1sica 2","datePublished":"2025-02-18T08:00:00+00:00","dateModified":"2025-10-23T08:07:07+00:00","mainEntityOfPage":{"@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/"},"wordCount":980,"commentCount":0,"publisher":{"@id":"https:\/\/carontestudio.com\/blog\/#organization"},"image":{"@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#primaryimage"},"thumbnailUrl":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/flutter21.jpg","articleSection":["Programaci\u00f3n"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/","url":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/","name":"Crea tu primera App con Flutter: Navegaci\u00f3n, Widgets... - Caronte","isPartOf":{"@id":"https:\/\/carontestudio.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#primaryimage"},"image":{"@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#primaryimage"},"thumbnailUrl":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/flutter21.jpg","datePublished":"2025-02-18T08:00:00+00:00","dateModified":"2025-10-23T08:07:07+00:00","description":"En esta segunda parte de crear tu primera app, veremos como funcionan la navegaci\u00f3n, widgets, animaciones y conexi\u00f3n a internet en Flutter.","breadcrumb":{"@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#primaryimage","url":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/flutter21.jpg","contentUrl":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/01\/flutter21.jpg","width":1250,"height":737},{"@type":"BreadcrumbList","@id":"https:\/\/carontestudio.com\/blog\/crear-app-con-flutter-guia-basica-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/carontestudio.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo crear tu primera App con Flutter: Gu\u00eda b\u00e1sica 2"}]},{"@type":"WebSite","@id":"https:\/\/carontestudio.com\/blog\/#website","url":"https:\/\/carontestudio.com\/blog\/","name":"Blog de marketing | Caronte","description":"En nuestro blog encontrar\u00e1s art\u00edculos semanales sobre SEO, marketing online, programaci\u00f3n web y mucho m\u00e1s.","publisher":{"@id":"https:\/\/carontestudio.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/carontestudio.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/carontestudio.com\/blog\/#organization","name":"Caronte - Agencia de marketing","url":"https:\/\/carontestudio.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/carontestudio.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/06\/caronte-agencia-de-marketing-logo.png","contentUrl":"https:\/\/carontestudio.com\/blog\/wp-content\/uploads\/2025\/06\/caronte-agencia-de-marketing-logo.png","width":1090,"height":155,"caption":"Caronte - Agencia de marketing"},"image":{"@id":"https:\/\/carontestudio.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/carontewebstudio\/","https:\/\/www.instagram.com\/caronte_studio\/","https:\/\/www.tiktok.com\/@carontewebstudio","https:\/\/www.youtube.com\/@carontewebstudio","https:\/\/es.linkedin.com\/company\/carontewebstudio"]},{"@type":"Person","@id":"https:\/\/carontestudio.com\/blog\/#\/schema\/person\/300ad5e85146a39ec7ea40f21abc8b38","name":"Irune Guinea","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/3002e85ac73b53aad9f60e3f1b230ffa3c9dcfcf1167b8cc8131a093f97a15da?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3002e85ac73b53aad9f60e3f1b230ffa3c9dcfcf1167b8cc8131a093f97a15da?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3002e85ac73b53aad9f60e3f1b230ffa3c9dcfcf1167b8cc8131a093f97a15da?s=96&d=mm&r=g","caption":"Irune Guinea"},"url":"https:\/\/carontestudio.com\/blog\/author\/irune\/"}]}},"_links":{"self":[{"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/posts\/21790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/comments?post=21790"}],"version-history":[{"count":70,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/posts\/21790\/revisions"}],"predecessor-version":[{"id":23940,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/posts\/21790\/revisions\/23940"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/media\/21860"}],"wp:attachment":[{"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/media?parent=21790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/categories?post=21790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carontestudio.com\/blog\/wp-json\/wp\/v2\/tags?post=21790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}