{"action":"created","comment":{"url":"https://api.github.com/repos/flutter-es/website/pulls/comments/212791736","pull_request_review_id":149501469,"id":212791736,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMjc5MTczNg==","diff_hunk":"@@ -0,0 +1,1937 @@\n+---\n+layout: page\n+title: Flutter para desarrolladores iOS\n+permalink: /flutter-for-ios/\n+---\n+\n+Este documento es para desarrolladores en iOS que buscan aplicar su conocimiento existente sobre iOS para construir aplicaciones móviles con Flutter. Si entiendes los fundamentos del marco de trabajo de iOS, entonces puedes usar este documento como una forma de empezar a aprender a desarrollar con Flutter.\n+\n+Tus conocimientos y habilidades sobre iOS son muy valiosos cuando construyes con\n+Flutter, porque Flutter se apoya en el sistema operativo móvil para numerosas\n+capacidades y configuraciones. Flutter es una nueva forma de crear interfaces de usuario para móviles,\n+pero tiene un sistema de plugin para comunicarse con (iOS y Android) para tareas que no sean de interfaz de usuario. Si eres un experto en desarrollo iOS, no tienes que volver a aprenderlo todo\n+para usar Flutter.\n+\n+Este documento puede ser utilizado como un libro de cocina saltando alrededor y encontrando las preguntas que son más relevantes a tus necesidades.\n+\n+* TOC Placeholder\n+{:toc}\n+\n+# Vistas\n+\n+## ¿Cuál es el equivalente a un `UIView` en Flutter?\n+\n+En iOS, la mayor parte de lo que se crea en la interfaz de usuario se hace utilizando objetos de vista, que son\n+de la clase  `UIView`. Estos pueden actuar como contenedores para otras `UIView`, que forman tu layout.\n+\n+En Flutter, el equivalente aproximado a un `UIView` es un `Widget`. Los Widgets no se mapean\n+exactamente a las vistas de iOS, pero mientras te familiarizas con el funcionamiento de Flutter\n+puedes pensar en ellos como \"la forma en que declaras y construyes la interfaz de usuario\".\n+\n+Sin embargo, estos tienen algunas diferencias con un `UIView`. Para empezar, los widgets tienen diferentes vidas útiles: son inmutables y sólo existen hasta que necesitan ser cambiado. \n+Cada vez que los widgets o su estado cambian, el framework de Flutter crea\n+un nuevo árbol de instancias de widgets. En comparación, una vista iOS no se recrea cuando\n+cambia, sino que es una entidad mutable que se dibuja una vez y no lo hace\n+redibujar hasta que se invalide usando `setNeedsDisplay()`.\n+\n+Además, a diferencia de `UIView`, los widgets de Flutter son ligeros, en parte debido\n+a su inmutabilidad. Porque no son puntos de vista en sí mismos, y no están directamente\n+dibujando cualquier cosa, sino más bien son una descripción de la interfaz de usuario y su semántica\n+\"desorbitada\" en objetos de visión real bajo el capó.\n+\n+Flutter incluye la librería [Material Components](https://material.io/develop/flutter/). Estos son los widgets que implementan la directiva\n+[Material Design guidelines](https://material.io/design/). El diseño de materiales es un\n+sistema de diseño flexible [optimizado para todas las\n+plataformas](https://material.io/design/platform-guidance/cross-platform-adaptation.html#cross-platform-guidelines),\n+incluyendo iOS.\n+\n+Pero Flutter es lo suficientemente flexible y expresivo como para implementar cualquier lenguaje de diseño.\n+En iOS, puede utilizar la función  [Cupertino widgets](https://flutter.io/widgets/cupertino/)\n+para producir una interfaz que se parezca a\n+[Lenguaje de diseño iOS de Apple](https://developer.apple.com/design/resources/).\n+\n+## ¿Cómo actualizo `Widget`s?\n+\n+Para actualizar tus vistas en iOS, los transformas directamente. En Flutter, los widgets son\n+inmutables y no actualizadas directamente. En su lugar, tiene que manipular el\n+state del widget.\n+\n+Aquí es donde el concepto de los widgets Stateful vs Stateless\n+entra en escena.  Un `StatelessWidget` es justo lo que suena como un widget sin\n+state adjunto.\n+\n+Los `StatelessWidgets` son útiles cuando la parte de la interfaz de usuario que usted está\n+describiendo no depende de nada más que de la configuración inicial\n+información en el widget.\n+\n+Por ejemplo, en iOS, esto es similar a colocar un `UIImageView` con\n+su logo como la `image`. Si el logotipo no cambia durante el tiempo de ejecución,\n+usar un `StatelessWidget` en Flutter.\n+\n+Si desea cambiar dinámicamente la interfaz de usuario basándose en los datos recibidos después de hacer una\n+llamada HTTP, utiliza un `StatefulWidget`. Después de que la llamada HTTP se haya\n+completado, avisa al framework Flutter que el `State` del widget ha sido \n+actualizado, para que pueda actualizar la interfaz de usuario.\n+\n+La diferencia importante entre stateless y stateful widgets es que `StatefulWidget`s tiene un `State` objeto que almacena el estado de los datos  y lo lleva a través de estructuras de árboles reconstruidos, para que no se pierda.\n+\n+Si tienes dudas, recuerda esta regla: si un widget cambia fuera de\n+el método `build` (debido a las interacciones de los usuarios en tiempo de ejecución, por ejemplo), está lleno de stateful.\n+Si el widget nunca cambia, una vez construido, es stateless.\n+Sin embargo, incluso si un widget está stateless, el que contiene el widget padre todavía puede\n+ser stateless si no está reaccionando a esos cambios (u otras entradas).\n+\n+El siguiente ejemplo muestra cómo usar un  `StatelessWidget`. Un\n+-`StatelessWidget` común es el widget `Text`. Si nos fijamos en la implementación de\n+-el widget `Text` lo encontrará en las subclases `StatelessWidget`.\n+\n+<!-- skip -->\n+{% prettify dart %}\n+Text(\n+  'Me gusta Flutter!',\n+  style: TextStyle(fontWeight: FontWeight.bold),\n+);\n+{% endprettify %}\n+\n+Si miras el código de arriba, puedes notar que el widget `Text`\n+no lleva ningún estado explícito. Hace lo que se pasa en su\n+constructores y nada más.\n+\n+Pero, ¿qué pasa si quieres hacer que “Me gusta Flutter!“ cambie dinámicamente, por ejemplo\n+al hacer clic en un `FloatingActionButton` ?\n+\n+Para lograr esto, coloca el `Text` widget en un `StatefulWidget` y actualizarlo cuando el usuario haga clic en el botón.\n+\n+Por ejemplo:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+class SampleApp extends StatelessWidget {\n+  // Este widget es la raíz de su aplicación.\n+  @override\n+  Widget build(BuildContext context) {\n+    return MaterialApp(\n+      title: 'Sample App',\n+      theme: ThemeData(\n+        primarySwatch: Colors.blue,\n+      ),\n+      home: SampleAppPage(),\n+    );\n+  }\n+}\n+\n+class SampleAppPage extends StatefulWidget {\n+  SampleAppPage({Key key}) : super(key: key);\n+\n+  @override\n+  _SampleAppPageState createState() => _SampleAppPageState();\n+}\n+\n+class _SampleAppPageState extends State<SampleAppPage> {\n+  // Default placeholder text\n+  String textToShow = \"I Like Flutter\";\n+  void _updateText() {\n+    setState(() {\n+      // update the text\n+      textToShow = \"Flutter is Awesome!\";\n+    });\n+  }\n+  @override\n+  Widget build(BuildContext context) {\n+    return Scaffold(\n+      appBar: AppBar(\n+        title: Text(\"Sample App\"),\n+      ),\n+      body: Center(child: Text(textToShow)),\n+      floatingActionButton: FloatingActionButton(\n+        onPressed: _updateText,\n+        tooltip: 'Update Text',\n+        child: Icon(Icons.update),\n+      ),\n+    );\n+  }\n+}\n+{% endprettify %}\n+\n+## ¿Cómo diseño mis widgets? ¿Dónde está mi Storyboard?\n+\n+En iOS, puede utilizar un archivo de Storyboard para organizar sus vistas y establecer\n+restricciones, o puede establecer sus restricciones programáticamente en su vista\n+controladores. En Flutter, declara tu diseño en código componiendo\n+un árbol de widgets.\n+\n+El siguiente ejemplo muestra cómo mostrar un widget simple con relleno:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+@override\n+Widget build(BuildContext context) {\n+  return Scaffold(\n+    appBar: AppBar(\n+      title: Text(\"Sample App\"),\n+    ),\n+    body: Center(\n+      child: CupertinoButton(\n+        onPressed: () {\n+          setState(() { _pressedCount += 1; });\n+        },\n+        child: Text('Hello'),\n+        padding: EdgeInsets.only(left: 10.0, right: 10.0),\n+      ),\n+    ),\n+  );\n+}\n+{% endprettify %}\n+\n+Puedes añadir relleno a cualquier widget, lo que imita la restricciones\n+en iOS.\n+\n+Puedes ver los diseños que Flutter tiene para ofrecer en la sección [catálogo de widgets](/widgets/layout/).\n+\n+## ¿Cómo agrego o elimino un componente de mi diseño?\n+\n+En iOS, se llama `addSubview()` en el padre, o `removeFromSuperview()`\n+en una vista secundaria para añadir o eliminar dinámicamente vistas secundarias. En Flutter, porque\n+son inmutables no hay equivalente directo a `addSubview()`.\n+En su lugar, puede pasar una función al padre que devuelva un widget, y\n+controlar la creación de ese hijo con una etiqueta booleana.\n+\n+El siguiente ejemplo muestra cómo alternar entre dos widgets cuando el usuario hace clic\n+el  `FloatingActionButton`:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+class SampleApp extends StatelessWidget {\n+  // Este widget es la raíz de su aplicación.\n+  @override\n+  Widget build(BuildContext context) {\n+    return MaterialApp(\n+      title: 'Sample App',\n+      theme: ThemeData(\n+        primarySwatch: Colors.blue,\n+      ),\n+      home: SampleAppPage(),\n+    );\n+  }\n+}\n+\n+class SampleAppPage extends StatefulWidget {\n+  SampleAppPage({Key key}) : super(key: key);\n+\n+  @override\n+  _SampleAppPageState createState() => _SampleAppPageState();\n+}\n+\n+class _SampleAppPageState extends State<SampleAppPage> {\n+  // Valor por defecto para toggle\n+  bool toggle = true;\n+  void _toggle() {\n+    setState(() {\n+      toggle = !toggle;\n+    });\n+  }\n+\n+  _getToggleChild() {\n+    if (toggle) {\n+      return Text('Toggle One');\n+    } else {\n+      return CupertinoButton(\n+        onPressed: () {},\n+        child: Text('Toggle Two'),\n+      );\n+    }\n+  }\n+\n+  @override\n+  Widget build(BuildContext context) {\n+    return Scaffold(\n+      appBar: AppBar(\n+        title: Text(\"Sample App\"),\n+      ),\n+      body: Center(\n+        child: _getToggleChild(),\n+      ),\n+      floatingActionButton: FloatingActionButton(\n+        onPressed: _toggle,\n+        tooltip: 'Update Text',\n+        child: Icon(Icons.update),\n+      ),\n+    );\n+  }\n+}\n+{% endprettify %}\n+\n+## ¿Cómo puedo animar un Widget?\n+\n+En iOS, puedes crear una animación llamando al método\n+`animate(withDuration:animations:)` en una vista. En Flutter,\n+usar la biblioteca de animación para incluir widgets dentro de un widget animado.\n+\n+En Flutter, usa un  `AnimationController`, que es un `Animation<double>`\n+que puede pausar, buscar, detener e invertir la animación. Requiere un `Ticker`\n+que señala cuando ocurre la sincronización y produce una interpolación lineal entre\n+0 y 1 en cada fotograma mientras está en marcha. A continuación, se crean uno o varios\n+`Animation`s y adjuntarlos al controlador.\n+\n+Por ejemplo, puede usar `CurvedAnimation` para implementar una animación\n+a lo largo de una curva interpolada. En este sentido, el controlador\n+es la fuente \"maestra\" del progreso de la animación y la  `CurvedAnimation`\n+calcula la curva que reemplaza el movimiento lineal predeterminado del controlador.\n+Al igual que los widgets, las animaciones en Flutter trabajan con la composición.\n+\n+Cuando construya el árbol de widgets, asigne la `Animation` a una propiedad animada\n+de un widget, como la opacidad de una `FadeTransition`, y decirle a la propiedad\n+para iniciar la animación.\n+\n+El siguiente ejemplo muestra cómo escribir un `FadeTransition` que desvanece el widget\n+en un logotipo al pulsar el botón  `FloatingActionButton`:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+class SampleApp extends StatelessWidget {\n+  // Este widget es la raíz de tu aplicación.\n+  @override\n+  Widget build(BuildContext context) {\n+    return MaterialApp(\n+      title: 'Fade Demo',\n+      theme: ThemeData(\n+        primarySwatch: Colors.blue,\n+      ),\n+      home: MyFadeTest(title: 'Fade Demo'),\n+    );\n+  }\n+}\n+\n+class MyFadeTest extends StatefulWidget {\n+  MyFadeTest({Key key, this.title}) : super(key: key);\n+\n+  final String title;\n+\n+  @override\n+  _MyFadeTest createState() => _MyFadeTest();\n+}\n+\n+class _MyFadeTest extends State<MyFadeTest> with TickerProviderStateMixin {\n+  AnimationController controller;\n+  CurvedAnimation curve;\n+\n+  @override\n+  void initState() {\n+    controller = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);\n+    curve = CurvedAnimation(parent: controller, curve: Curves.easeIn);\n+  }\n+\n+  @override\n+  Widget build(BuildContext context) {\n+    return Scaffold(\n+      appBar: AppBar(\n+        title: Text(widget.title),\n+      ),\n+      body: Center(\n+        child: Container(\n+          child: FadeTransition(\n+            opacity: curve,\n+            child: FlutterLogo(\n+              size: 100.0,\n+            )\n+          )\n+        )\n+      ),\n+      floatingActionButton: FloatingActionButton(\n+        tooltip: 'Fade',\n+        child: Icon(Icons.brush),\n+        onPressed: () {\n+          controller.forward();\n+        },\n+      ),\n+    );\n+  }\n+\n+  @override\n+  dispose() {\n+    controller.dispose();\n+    super.dispose();\n+  }\n+}\n+{% endprettify %}\n+\n+Para más información, véase\n+[Widgets de animación y movimiento](/widgets/animation/),\n+la [Tutorial de animaciones](/tutorials/animation),\n+y el [Perspectiva general de las animaciones](/animations/).\n+\n+## ¿Cómo puedo dibujar en la pantalla?\n+\n+En iOS, utilizas  `CoreGraphics` para dibujar líneas y formas en la\n+pantalla. Flutter tiene una API diferente basada en la clase  `Canvas` con dos\n+otras clases que te ayudan a dibujar: `CustomPaint` y `CustomPainter`, este último de los cuales implementa su algoritmo para dibujar al lienzo.\n+\n+Para aprender cómo implementar un pintor de firmas en Flutter, vea la respuesta de Collin \n+en [StackOverflow](https://stackoverflow.com/questions/46241071/create-signature-area-for-mobile-app-in-dart-flutter).\n+\n+<!-- skip -->\n+{% prettify dart %}\n+class SignaturePainter extends CustomPainter {\n+  SignaturePainter(this.points);\n+\n+  final List<Offset> points;\n+\n+  void paint(Canvas canvas, Size size) {\n+    var paint = Paint()\n+      ..color = Colors.black\n+      ..strokeCap = StrokeCap.round\n+      ..strokeWidth = 5.0;\n+    for (int i = 0; i < points.length - 1; i++) {\n+      if (points[i] != null && points[i + 1] != null)\n+        canvas.drawLine(points[i], points[i + 1], paint);\n+    }\n+  }\n+\n+  bool shouldRepaint(SignaturePainter other) => other.points != points;\n+}\n+\n+class Signature extends StatefulWidget {\n+  SignatureState createState() => SignatureState();\n+}\n+\n+class SignatureState extends State<Signature> {\n+\n+  List<Offset> _points = <Offset>[];\n+\n+  Widget build(BuildContext context) {\n+    return GestureDetector(\n+      onPanUpdate: (DragUpdateDetails details) {\n+        setState(() {\n+          RenderBox referenceBox = context.findRenderObject();\n+          Offset localPosition =\n+          referenceBox.globalToLocal(details.globalPosition);\n+          _points = List.from(_points)..add(localPosition);\n+        });\n+      },\n+      onPanEnd: (DragEndDetails details) => _points.add(null),\n+      child: CustomPaint(painter: SignaturePainter(_points), size: Size.infinite),\n+    );\n+  }\n+}\n+{% endprettify %}\n+\n+## ¿Dónde está la opacidad del widget?\n+\n+En iOS, todo tiene .opacidad o .alpha. En Flutter, la mayor parte del tiempo necesitas\n+envolver un widget en un widget de Opacidad para lograr esto.\n+\n+## ¿Cómo construyo widgets personalizados?\n+\n+En iOS, normalmente se subclasifica `UIView`, o se utiliza una vista preexistente, para\n+anular e implementar métodos que logren el comportamiento deseado. En\n+En Flutter, construye un widget personalizado mediante\n+[composición](/technical-overview/#everythings-a-widget) widgets más pequeños\n+(en lugar de extenderlos).\n+\n+Por ejemplo, ¿cómo se construye un `CustomButton` que tome una etiqueta en\n+el constructor? Cree un botón personalizado que componga un `RaisedButton` con una etiqueta,\n+en lugar de extender `RaisedButton`:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+class CustomButton extends StatelessWidget {\n+  final String label;\n+\n+  CustomButton(this.label);\n+\n+  @override\n+  Widget build(BuildContext context) {\n+    return RaisedButton(onPressed: () {}, child: Text(label));\n+  }\n+}\n+{% endprettify %}\n+\n+Entonces utiliza `CustomButton`, tal y como lo harías con cualquier otro widget de Flutter:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+@override\n+Widget build(BuildContext context) {\n+  return Center(\n+    child: CustomButton(\"Hello\"),\n+  );\n+}\n+{% endprettify %}\n+\n+# Navegación\n+\n+## ¿Cómo desplazarse entre páginas?\n+\n+En iOS, para desplazarse entre los controladores de vista, puede utilizar el botón\n+`UINavigationController` que gestiona la pila de controladores de vista para\n+mostrar en la pantalla.\n+\n+Flutter tiene una implementación similar, usando un `Navigator` y\n+\"Rutas\". Una `Ruta` es una abstracción para una \"pantalla\" o \"página\" de una aplicación, y\n+un `Navegador` es un [widget](technical-overview/#everythings-a-widget)\n+que gestiona las rutas. Una ruta se mapea aproximadamente a un\n+`UIViewController`. El navegador funciona de forma similar al iOS\n+`UINavigationController`, en el que puede `push()` y `pop()` rutas dependiendo de\n+para saber si desea navegar hacia o desde una vista.\n+\n+Para navegar entre páginas, tiene un par de opciones:\n+\n+* Especifique un `Map` de nombres de ruta. (MaterialApp)\n+* Navegar directamente a una ruta. (WidgetApp)\n+\n+El siguiente ejemplo construye un Mapa.\n+\n+<!-- skip -->\n+{% prettify dart %}\n+void main() {\n+  runApp(MaterialApp(\n+    home: MyAppHome(), // se convierte en la ruta que se llamará '/'\n+    routes: <String, WidgetBuilder> {\n+      '/a': (BuildContext context) => MyPage(title: 'page A'),\n+      '/b': (BuildContext context) => MyPage(title: 'page B'),\n+      '/c': (BuildContext context) => MyPage(title: 'page C'),\n+    },\n+  ));\n+}\n+{% endprettify %}\n+\n+Navegue hasta una ruta `push` por su nombre en el `Navigator`.\n+\n+<!-- skip -->\n+{% prettify dart %}\n+Navigator.of(context).pushNamed('/b');\n+{% endprettify %}\n+\n+La clase `Navigator` maneja enrutamiento en Flutter y se utiliza para obtener\n+un resultado de una ruta que ha empujado en la pila. Esto se hace\n+`await` el `Future` devuelto por `push()`.\n+\n+Por ejemplo, para iniciar una ruta de 'localización' que permita al usuario seleccionar sus\n+localización, se puede hacer lo siguiente:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+Map coordinates = await Navigator.of(context).pushNamed('/location');\n+{% endprettify %}\n+\n+Y luego, dentro de tu ruta de'localización', una vez que el usuario haya seleccionado su\n+localización, `pop()` la pila con el resultado:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+Navigator.of(context).pop({\"lat\":43.821757,\"long\":-79.226392});\n+{% endprettify %}\n+\n+## ¿Cómo puedo navegar a otra aplicación?\n+\n+En iOS, para enviar al usuario a otra aplicación, se utiliza la función\n+Esquema de URL específico. Para las aplicaciones a nivel de sistema, el esquema\n+depende de la aplicación. Para implementar esta funcionalidad en Flutter,\n+crear una integración de plataforma nativa, o utilizar una plataforma existente\n+[plugin](#plugins), tales como [`url_launcher`](https://pub.dartlang.org/packages/url_launcher).\n+\n+## ¿Cómo puedo volver al controlador de vista nativo de iOS?\n+\n+LLamando a `SystemNavigator.pop()` desde su código Dart invoca la opción\n+siguiendo el código iOS:\n+\n+```\n+UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;\n+  if ([viewController isKindOfClass:[UINavigationController class]]) {\n+    [((UINavigationController*)viewController) popViewControllerAnimated:NO];\n+  }\n+```\n+\n+Si eso no hace lo que quieres, puedes crear el tuyo propio\n+[canal de plataforma](/platform-channels/) para invocar código iOS de forma arbitraria.\n+\n+# Hilos & asincronicidad\n+\n+## ¿Cómo se puede escribir código asíncrono?\n+\n+Dart tiene un modelo de ejecución de un solo hilo, con soporte para  `Isolate`s (una forma de\n+para ejecutar código Dart en otro hilo), un bucle de eventos y programación asíncrona.\n+A menos que usted genere un `Isolate`, su código Dart se ejecuta en el hilo principal de la interfaz de usuario y es\n+conducido por un bucle de eventos. El bucle de eventos del flutter es equivalente al bucle principal del iOS main\n+loop;es decir, the `Looper` que está conectado al hilo principal.\n+\n+El modelo de un solo hilo de Dart no significa que se requiere que usted ejecute todo como\n+una operación de bloqueo que hace que la interfaz de usuario se bloquee. En vez de eso,\n+usar las facilidades asincrónicas que proporciona el lenguaje Dart, tales como\n+`async`/`await`, para realizar trabajos asincrónicos.\n+\n+Por ejemplo, puede ejecutar código de red sin que la interfaz de usuario se bloquee utilizando\n+`async`/`await` y dejar que Dart haga el trabajo pesado:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+loadData() async {\n+  String dataURL = \"https://jsonplaceholder.typicode.com/posts\";\n+  http.Response response = await http.get(dataURL);\n+  setState(() {\n+    widgets = json.decode(response.body);\n+  });\n+}\n+{% endprettify %}\n+\n+Una vez que el `await` la llamada de red se realiza, actualizar la interfaz de usuario llamando al `setState()`,\n+que desencadena una reconstrucción del subárbol del widget y actualiza los datos.\n+\n+El siguiente ejemplo carga datos de forma asincrónica y los visualiza en un `ListView`:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+import 'dart:convert';\n+\n+import 'package:flutter/material.dart';\n+import 'package:http/http.dart' as http;\n+\n+void main() {\n+  runApp(SampleApp());\n+}\n+\n+class SampleApp extends StatelessWidget {\n+  @override\n+  Widget build(BuildContext context) {\n+    return MaterialApp(\n+      title: 'Sample App',\n+      theme: ThemeData(\n+        primarySwatch: Colors.blue,\n+      ),\n+      home: SampleAppPage(),\n+    );\n+  }\n+}\n+\n+class SampleAppPage extends StatefulWidget {\n+  SampleAppPage({Key key}) : super(key: key);\n+\n+  @override\n+  _SampleAppPageState createState() => _SampleAppPageState();\n+}\n+\n+class _SampleAppPageState extends State<SampleAppPage> {\n+  List widgets = [];\n+\n+  @override\n+  void initState() {\n+    super.initState();\n+\n+    loadData();\n+  }\n+\n+  @override\n+  Widget build(BuildContext context) {\n+    return Scaffold(\n+      appBar: AppBar(\n+        title: Text(\"Sample App\"),\n+      ),\n+      body: ListView.builder(\n+          itemCount: widgets.length,\n+          itemBuilder: (BuildContext context, int position) {\n+            return getRow(position);\n+          }));\n+  }\n+\n+  Widget getRow(int i) {\n+    return Padding(\n+      padding: EdgeInsets.all(10.0),\n+      child: Text(\"Row ${widgets[i][\"title\"]}\")\n+    );\n+  }\n+\n+  loadData() async {\n+    String dataURL = \"https://jsonplaceholder.typicode.com/posts\";\n+    http.Response response = await http.get(dataURL);\n+    setState(() {\n+      widgets = json.decode(response.body);\n+    });\n+  }\n+}\n+{% endprettify %}\n+\n+Consulte la siguiente sección para obtener más información sobre cómo realizar el trabajo en el\n+segundo plano y en qué se diferencia Flutter de iOS.\n+\n+## ¿Cómo se mueve el trabajo a un hilo de segundo plano?\n+\n+Ya que Flutter tiene un solo hilo y ejecuta un bucle de eventos (como Node.js), tú\n+no tiene que preocuparte por el manejo de hilos o por generar hilos de segundo plano. Si\n+está realizando un trabajo de E/S, como acceso al disco o una llamada de red, entonces\n+usted puede usar con seguridad `async`/`await` y estás listo. Si, por otro lado\n+necesita hacer un trabajo intensivo de computación que mantenga ocupada a la CPU,\n+quieres moverlo a un `Isolate` para evitar bloquear el bucle de eventos.\n+\n+Para el trabajo de E/S, declare la función como una `async` función,\n+y `await` en tareas de larga duración dentro de la función:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+loadData() async {\n+  String dataURL = \"https://jsonplaceholder.typicode.com/posts\";\n+  http.Response response = await http.get(dataURL);\n+  setState(() {\n+    widgets = json.decode(response.body);\n+  });\n+}\n+{% endprettify %}\n+\n+Así es como normalmente se realizan las llamadas a la red o a la base de datos, que son a la vez\n+Operaciones de E/S.\n+\n+Sin embargo, hay ocasiones en las que puede estar procesando una gran cantidad de datos y\n+tu interfaz de usuario se cuelga. En Flutter, utiliza `Isolate` para aprovechar\n+múltiples núcleos de CPU para realizar tareas de larga duración o que requieren un gran trabajo de computación.\n+\n+Los aislamientos son hilos de ejecución separados que no comparten ninguna memoria\n+con el principal acumulador de memoria de ejecución. Esto significa que no se puede acceder a las variables desde\n+el hilo principal, o actualice su interfaz de usuario llamando al `setState()`. Los aislamientos son fieles a\n+su nombre y no pueden compartir memoria (en forma de campos estáticos, por ejemplo).\n+\n+El siguiente ejemplo muestra, en un simple aislamiento, cómo compartir datos de nuevo a\n+el hilo principal para actualizar la interfaz de usuario.\n+\n+<!-- skip -->\n+{% prettify dart %}\n+loadData() async {\n+  ReceivePort receivePort = ReceivePort();\n+  await Isolate.spawn(dataLoader, receivePort.sendPort);\n+\n+  // El 'echo' isolate envía su SendPort como primer mensaje\n+  SendPort sendPort = await receivePort.first;\n+\n+  List msg = await sendReceive(sendPort, \"https://jsonplaceholder.typicode.com/posts\");\n+\n+  setState(() {\n+    widgets = msg;\n+  });\n+}\n+\n+// El punto de entrada para el aislamiento\n+static dataLoader(SendPort sendPort) async {\n+  // Para los mensajes entrantes, abra el ReceivePort.\n+  ReceivePort port = ReceivePort();\n+\n+  // Notifique a cualquier otro aislamiento a qué puerto escucha este aislamiento.\n+  sendPort.send(port.sendPort);\n+\n+  await for (var msg in port) {\n+    String data = msg[0];\n+    SendPort replyTo = msg[1];\n+\n+    String dataURL = data;\n+    http.Response response = await http.get(dataURL);\n+    // Lots of JSON to parse\n+    replyTo.send(json.decode(response.body));\n+  }\n+}\n+\n+Future sendReceive(SendPort port, msg) {\n+  ReceivePort response = ReceivePort();\n+  port.send([msg, response.sendPort]);\n+  return response.first;\n+}\n+{% endprettify %}\n+\n+Aquí, `dataLoader()` es el `Isolate` que corre en su propio hilo de ejecución separado.\n+En el aislamiento se puede realizar un procesamiento más intensivo de la CPU (analizando un archivo grande formato JSON, por ejemplo), o realizar cálculos matemáticos intensivos en computación, como encriptación o procesamiento de señales.\n+\n+Puede ejecutar el ejemplo completo a continuación:\n+\n+{% prettify dart %}\n+import 'dart:convert';\n+\n+import 'package:flutter/material.dart';\n+import 'package:http/http.dart' as http;\n+import 'dart:async';\n+import 'dart:isolate';\n+\n+void main() {\n+  runApp(SampleApp());\n+}\n+\n+class SampleApp extends StatelessWidget {\n+  @override\n+  Widget build(BuildContext context) {\n+    return MaterialApp(\n+      title: 'Sample App',\n+      theme: ThemeData(\n+        primarySwatch: Colors.blue,\n+      ),\n+      home: SampleAppPage(),\n+    );\n+  }\n+}\n+\n+class SampleAppPage extends StatefulWidget {\n+  SampleAppPage({Key key}) : super(key: key);\n+\n+  @override\n+  _SampleAppPageState createState() => _SampleAppPageState();\n+}\n+\n+class _SampleAppPageState extends State<SampleAppPage> {\n+  List widgets = [];\n+\n+  @override\n+  void initState() {\n+    super.initState();\n+    loadData();\n+  }\n+\n+  showLoadingDialog() {\n+    if (widgets.length == 0) {\n+      return true;\n+    }\n+\n+    return false;\n+  }\n+\n+  getBody() {\n+    if (showLoadingDialog()) {\n+      return getProgressDialog();\n+    } else {\n+      return getListView();\n+    }\n+  }\n+\n+  getProgressDialog() {\n+    return Center(child: CircularProgressIndicator());\n+  }\n+\n+  @override\n+  Widget build(BuildContext context) {\n+    return Scaffold(\n+        appBar: AppBar(\n+          title: Text(\"Sample App\"),\n+        ),\n+        body: getBody());\n+  }\n+\n+  ListView getListView() => ListView.builder(\n+      itemCount: widgets.length,\n+      itemBuilder: (BuildContext context, int position) {\n+        return getRow(position);\n+      });\n+\n+  Widget getRow(int i) {\n+    return Padding(padding: EdgeInsets.all(10.0), child: Text(\"Row ${widgets[i][\"title\"]}\"));\n+  }\n+\n+  loadData() async {\n+    ReceivePort receivePort = ReceivePort();\n+    await Isolate.spawn(dataLoader, receivePort.sendPort);\n+\n+    // El 'echo' isolate envía su SendPort como primer mensaje\n+    SendPort sendPort = await receivePort.first;\n+\n+    List msg = await sendReceive(sendPort, \"https://jsonplaceholder.typicode.com/posts\");\n+\n+    setState(() {\n+      widgets = msg;\n+    });\n+  }\n+\n+// El punto de entrada para el aislamiento\n+  static dataLoader(SendPort sendPort) async {\n+    // Para los mensajes entrantes, abra el ReceivePort.\n+    ReceivePort port = ReceivePort();\n+\n+    // Notifique a cualquier otro aislado a qué puerto escucha este aislado.\n+    sendPort.send(port.sendPort);\n+\n+    await for (var msg in port) {\n+      String data = msg[0];\n+      SendPort replyTo = msg[1];\n+\n+      String dataURL = data;\n+      http.Response response = await http.get(dataURL);\n+      // Lotes de JSON para analizar\n+      replyTo.send(json.decode(response.body));\n+    }\n+  }\n+\n+  Future sendReceive(SendPort port, msg) {\n+    ReceivePort response = ReceivePort();\n+    port.send([msg, response.sendPort]);\n+    return response.first;\n+  }\n+}\n+{% endprettify %}\n+\n+## Como puedo hacer peticiones de red?\n+\n+Realizar una petición de red en Flutter es fácil cuando se utiliza la popular función\n+[`http` package](https://pub.dartlang.org/packages/http). Esto abstrae una gran parte de la red que normalmente podría implementar usted mismo,\n+lo que simplifica la realización de peticiones de red.\n+\n+Para utilizar `http` package, añadirlo a sus dependencias en `pubspec.yaml`:\n+\n+<!-- skip -->\n+{% prettify yaml %}\n+dependencies:\n+  ...\n+  http: ^0.11.3+16\n+{% endprettify %}\n+\n+Para realizar una llamada de red, llame `await` en la `async` función `http.get()`:\n+\n+<!-- skip -->\n+{% prettify dart %}\n+import 'dart:convert';\n+\n+import 'package:flutter/material.dart';\n+import 'package:http/http.dart' as http;\n+[...]\n+  loadData() async {\n+    String dataURL = \"https://jsonplaceholder.typicode.com/posts\";\n+    http.Response response = await http.get(dataURL);\n+    setState(() {\n+      widgets = json.decode(response.body);\n+    });\n+  }\n+}\n+{% endprettify %}\n+\n+## ¿Cómo puedo mostrar el progreso de una tarea de larga duración?\n+\n+En iOS, normalmente se utiliza un `UIProgressView` durante la ejecución de un\n+una larga tarea en segundo plano.\n+\n+En Flutter, utilice un `ProgressIndicator` widget.","path":"es_ES/flutter-for-ios.md","position":901,"original_position":901,"commit_id":"8db2e0e2de8f7d14952d072d7410e5b02145e89e","original_commit_id":"8db2e0e2de8f7d14952d072d7410e5b02145e89e","user":{"login":"Twinber","id":5513621,"node_id":"MDQ6VXNlcjU1MTM2MjE=","avatar_url":"https://avatars0.githubusercontent.com/u/5513621?v=4","gravatar_id":"","url":"https://api.github.com/users/Twinber","html_url":"https://github.com/Twinber","followers_url":"https://api.github.com/users/Twinber/followers","following_url":"https://api.github.com/users/Twinber/following{/other_user}","gists_url":"https://api.github.com/users/Twinber/gists{/gist_id}","starred_url":"https://api.github.com/users/Twinber/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Twinber/subscriptions","organizations_url":"https://api.github.com/users/Twinber/orgs","repos_url":"https://api.github.com/users/Twinber/repos","events_url":"https://api.github.com/users/Twinber/events{/privacy}","received_events_url":"https://api.github.com/users/Twinber/received_events","type":"User","site_admin":false},"body":"usa","created_at":"2018-08-25T07:36:04Z","updated_at":"2018-08-25T07:46:39Z","html_url":"https://github.com/flutter-es/website/pull/250#discussion_r212791736","pull_request_url":"https://api.github.com/repos/flutter-es/website/pulls/250","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/flutter-es/website/pulls/comments/212791736"},"html":{"href":"https://github.com/flutter-es/website/pull/250#discussion_r212791736"},"pull_request":{"href":"https://api.github.com/repos/flutter-es/website/pulls/250"}}},"pull_request":{"url":"https://api.github.com/repos/flutter-es/website/pulls/250","id":210850051,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEwODUwMDUx","html_url":"https://github.com/flutter-es/website/pull/250","diff_url":"https://github.com/flutter-es/website/pull/250.diff","patch_url":"https://github.com/flutter-es/website/pull/250.patch","issue_url":"https://api.github.com/repos/flutter-es/website/issues/250","number":250,"state":"open","locked":false,"title":"traduccion de flutter_for_ios #09","user":{"login":"juanmorillios","id":4824933,"node_id":"MDQ6VXNlcjQ4MjQ5MzM=","avatar_url":"https://avatars0.githubusercontent.com/u/4824933?v=4","gravatar_id":"","url":"https://api.github.com/users/juanmorillios","html_url":"https://github.com/juanmorillios","followers_url":"https://api.github.com/users/juanmorillios/followers","following_url":"https://api.github.com/users/juanmorillios/following{/other_user}","gists_url":"https://api.github.com/users/juanmorillios/gists{/gist_id}","starred_url":"https://api.github.com/users/juanmorillios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juanmorillios/subscriptions","organizations_url":"https://api.github.com/users/juanmorillios/orgs","repos_url":"https://api.github.com/users/juanmorillios/repos","events_url":"https://api.github.com/users/juanmorillios/events{/privacy}","received_events_url":"https://api.github.com/users/juanmorillios/received_events","type":"User","site_admin":false},"body":"close #251 ","created_at":"2018-08-24T21:11:37Z","updated_at":"2018-08-25T07:46:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a6287a6ae9bd7055e0fadcce854db2c86bf824be","assignee":{"login":"juanmorillios","id":4824933,"node_id":"MDQ6VXNlcjQ4MjQ5MzM=","avatar_url":"https://avatars0.githubusercontent.com/u/4824933?v=4","gravatar_id":"","url":"https://api.github.com/users/juanmorillios","html_url":"https://github.com/juanmorillios","followers_url":"https://api.github.com/users/juanmorillios/followers","following_url":"https://api.github.com/users/juanmorillios/following{/other_user}","gists_url":"https://api.github.com/users/juanmorillios/gists{/gist_id}","starred_url":"https://api.github.com/users/juanmorillios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juanmorillios/subscriptions","organizations_url":"https://api.github.com/users/juanmorillios/orgs","repos_url":"https://api.github.com/users/juanmorillios/repos","events_url":"https://api.github.com/users/juanmorillios/events{/privacy}","received_events_url":"https://api.github.com/users/juanmorillios/received_events","type":"User","site_admin":false},"assignees":[{"login":"juanmorillios","id":4824933,"node_id":"MDQ6VXNlcjQ4MjQ5MzM=","avatar_url":"https://avatars0.githubusercontent.com/u/4824933?v=4","gravatar_id":"","url":"https://api.github.com/users/juanmorillios","html_url":"https://github.com/juanmorillios","followers_url":"https://api.github.com/users/juanmorillios/followers","following_url":"https://api.github.com/users/juanmorillios/following{/other_user}","gists_url":"https://api.github.com/users/juanmorillios/gists{/gist_id}","starred_url":"https://api.github.com/users/juanmorillios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juanmorillios/subscriptions","organizations_url":"https://api.github.com/users/juanmorillios/orgs","repos_url":"https://api.github.com/users/juanmorillios/repos","events_url":"https://api.github.com/users/juanmorillios/events{/privacy}","received_events_url":"https://api.github.com/users/juanmorillios/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"cronos88","id":5728603,"node_id":"MDQ6VXNlcjU3Mjg2MDM=","avatar_url":"https://avatars1.githubusercontent.com/u/5728603?v=4","gravatar_id":"","url":"https://api.github.com/users/cronos88","html_url":"https://github.com/cronos88","followers_url":"https://api.github.com/users/cronos88/followers","following_url":"https://api.github.com/users/cronos88/following{/other_user}","gists_url":"https://api.github.com/users/cronos88/gists{/gist_id}","starred_url":"https://api.github.com/users/cronos88/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cronos88/subscriptions","organizations_url":"https://api.github.com/users/cronos88/orgs","repos_url":"https://api.github.com/users/cronos88/repos","events_url":"https://api.github.com/users/cronos88/events{/privacy}","received_events_url":"https://api.github.com/users/cronos88/received_events","type":"User","site_admin":false},{"login":"alexcotte","id":6886316,"node_id":"MDQ6VXNlcjY4ODYzMTY=","avatar_url":"https://avatars3.githubusercontent.com/u/6886316?v=4","gravatar_id":"","url":"https://api.github.com/users/alexcotte","html_url":"https://github.com/alexcotte","followers_url":"https://api.github.com/users/alexcotte/followers","following_url":"https://api.github.com/users/alexcotte/following{/other_user}","gists_url":"https://api.github.com/users/alexcotte/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcotte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcotte/subscriptions","organizations_url":"https://api.github.com/users/alexcotte/orgs","repos_url":"https://api.github.com/users/alexcotte/repos","events_url":"https://api.github.com/users/alexcotte/events{/privacy}","received_events_url":"https://api.github.com/users/alexcotte/received_events","type":"User","site_admin":false},{"login":"caveligh","id":8608495,"node_id":"MDQ6VXNlcjg2MDg0OTU=","avatar_url":"https://avatars3.githubusercontent.com/u/8608495?v=4","gravatar_id":"","url":"https://api.github.com/users/caveligh","html_url":"https://github.com/caveligh","followers_url":"https://api.github.com/users/caveligh/followers","following_url":"https://api.github.com/users/caveligh/following{/other_user}","gists_url":"https://api.github.com/users/caveligh/gists{/gist_id}","starred_url":"https://api.github.com/users/caveligh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caveligh/subscriptions","organizations_url":"https://api.github.com/users/caveligh/orgs","repos_url":"https://api.github.com/users/caveligh/repos","events_url":"https://api.github.com/users/caveligh/events{/privacy}","received_events_url":"https://api.github.com/users/caveligh/received_events","type":"User","site_admin":false},{"login":"Arkangel12","id":29683014,"node_id":"MDQ6VXNlcjI5NjgzMDE0","avatar_url":"https://avatars3.githubusercontent.com/u/29683014?v=4","gravatar_id":"","url":"https://api.github.com/users/Arkangel12","html_url":"https://github.com/Arkangel12","followers_url":"https://api.github.com/users/Arkangel12/followers","following_url":"https://api.github.com/users/Arkangel12/following{/other_user}","gists_url":"https://api.github.com/users/Arkangel12/gists{/gist_id}","starred_url":"https://api.github.com/users/Arkangel12/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Arkangel12/subscriptions","organizations_url":"https://api.github.com/users/Arkangel12/orgs","repos_url":"https://api.github.com/users/Arkangel12/repos","events_url":"https://api.github.com/users/Arkangel12/events{/privacy}","received_events_url":"https://api.github.com/users/Arkangel12/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":1009652726,"node_id":"MDU6TGFiZWwxMDA5NjUyNzI2","url":"https://api.github.com/repos/flutter-es/website/labels/Traducci%C3%B3n","name":"Traducción","color":"4629a5","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/flutter-es/website/pulls/250/commits","review_comments_url":"https://api.github.com/repos/flutter-es/website/pulls/250/comments","review_comment_url":"https://api.github.com/repos/flutter-es/website/pulls/comments{/number}","comments_url":"https://api.github.com/repos/flutter-es/website/issues/250/comments","statuses_url":"https://api.github.com/repos/flutter-es/website/statuses/8db2e0e2de8f7d14952d072d7410e5b02145e89e","head":{"label":"flutter-es:flutter_for_ios","ref":"flutter_for_ios","sha":"8db2e0e2de8f7d14952d072d7410e5b02145e89e","user":{"login":"flutter-es","id":41843975,"node_id":"MDQ6VXNlcjQxODQzOTc1","avatar_url":"https://avatars3.githubusercontent.com/u/41843975?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter-es","html_url":"https://github.com/flutter-es","followers_url":"https://api.github.com/users/flutter-es/followers","following_url":"https://api.github.com/users/flutter-es/following{/other_user}","gists_url":"https://api.github.com/users/flutter-es/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter-es/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter-es/subscriptions","organizations_url":"https://api.github.com/users/flutter-es/orgs","repos_url":"https://api.github.com/users/flutter-es/repos","events_url":"https://api.github.com/users/flutter-es/events{/privacy}","received_events_url":"https://api.github.com/users/flutter-es/received_events","type":"User","site_admin":false},"repo":{"id":142719942,"node_id":"MDEwOlJlcG9zaXRvcnkxNDI3MTk5NDI=","name":"website","full_name":"flutter-es/website","owner":{"login":"flutter-es","id":41843975,"node_id":"MDQ6VXNlcjQxODQzOTc1","avatar_url":"https://avatars3.githubusercontent.com/u/41843975?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter-es","html_url":"https://github.com/flutter-es","followers_url":"https://api.github.com/users/flutter-es/followers","following_url":"https://api.github.com/users/flutter-es/following{/other_user}","gists_url":"https://api.github.com/users/flutter-es/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter-es/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter-es/subscriptions","organizations_url":"https://api.github.com/users/flutter-es/orgs","repos_url":"https://api.github.com/users/flutter-es/repos","events_url":"https://api.github.com/users/flutter-es/events{/privacy}","received_events_url":"https://api.github.com/users/flutter-es/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/flutter-es/website","description":"Flutter web en español (trabajo en proceso)","fork":true,"url":"https://api.github.com/repos/flutter-es/website","forks_url":"https://api.github.com/repos/flutter-es/website/forks","keys_url":"https://api.github.com/repos/flutter-es/website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/flutter-es/website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/flutter-es/website/teams","hooks_url":"https://api.github.com/repos/flutter-es/website/hooks","issue_events_url":"https://api.github.com/repos/flutter-es/website/issues/events{/number}","events_url":"https://api.github.com/repos/flutter-es/website/events","assignees_url":"https://api.github.com/repos/flutter-es/website/assignees{/user}","branches_url":"https://api.github.com/repos/flutter-es/website/branches{/branch}","tags_url":"https://api.github.com/repos/flutter-es/website/tags","blobs_url":"https://api.github.com/repos/flutter-es/website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/flutter-es/website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/flutter-es/website/git/refs{/sha}","trees_url":"https://api.github.com/repos/flutter-es/website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/flutter-es/website/statuses/{sha}","languages_url":"https://api.github.com/repos/flutter-es/website/languages","stargazers_url":"https://api.github.com/repos/flutter-es/website/stargazers","contributors_url":"https://api.github.com/repos/flutter-es/website/contributors","subscribers_url":"https://api.github.com/repos/flutter-es/website/subscribers","subscription_url":"https://api.github.com/repos/flutter-es/website/subscription","commits_url":"https://api.github.com/repos/flutter-es/website/commits{/sha}","git_commits_url":"https://api.github.com/repos/flutter-es/website/git/commits{/sha}","comments_url":"https://api.github.com/repos/flutter-es/website/comments{/number}","issue_comment_url":"https://api.github.com/repos/flutter-es/website/issues/comments{/number}","contents_url":"https://api.github.com/repos/flutter-es/website/contents/{+path}","compare_url":"https://api.github.com/repos/flutter-es/website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/flutter-es/website/merges","archive_url":"https://api.github.com/repos/flutter-es/website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/flutter-es/website/downloads","issues_url":"https://api.github.com/repos/flutter-es/website/issues{/number}","pulls_url":"https://api.github.com/repos/flutter-es/website/pulls{/number}","milestones_url":"https://api.github.com/repos/flutter-es/website/milestones{/number}","notifications_url":"https://api.github.com/repos/flutter-es/website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/flutter-es/website/labels{/name}","releases_url":"https://api.github.com/repos/flutter-es/website/releases{/id}","deployments_url":"https://api.github.com/repos/flutter-es/website/deployments","created_at":"2018-07-29T00:46:28Z","updated_at":"2018-08-25T05:24:54Z","pushed_at":"2018-08-25T05:38:46Z","git_url":"git://github.com/flutter-es/website.git","ssh_url":"git@github.com:flutter-es/website.git","clone_url":"https://github.com/flutter-es/website.git","svn_url":"https://github.com/flutter-es/website","homepage":"https://flutter-es.firebaseapp.com/","size":79637,"stargazers_count":17,"watchers_count":17,"language":"Dart","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":86,"license":null,"forks":1,"open_issues":86,"watchers":17,"default_branch":"master"}},"base":{"label":"flutter-es:master","ref":"master","sha":"1d771b20d30c21ab560fb587e284d7324afe29f4","user":{"login":"flutter-es","id":41843975,"node_id":"MDQ6VXNlcjQxODQzOTc1","avatar_url":"https://avatars3.githubusercontent.com/u/41843975?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter-es","html_url":"https://github.com/flutter-es","followers_url":"https://api.github.com/users/flutter-es/followers","following_url":"https://api.github.com/users/flutter-es/following{/other_user}","gists_url":"https://api.github.com/users/flutter-es/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter-es/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter-es/subscriptions","organizations_url":"https://api.github.com/users/flutter-es/orgs","repos_url":"https://api.github.com/users/flutter-es/repos","events_url":"https://api.github.com/users/flutter-es/events{/privacy}","received_events_url":"https://api.github.com/users/flutter-es/received_events","type":"User","site_admin":false},"repo":{"id":142719942,"node_id":"MDEwOlJlcG9zaXRvcnkxNDI3MTk5NDI=","name":"website","full_name":"flutter-es/website","owner":{"login":"flutter-es","id":41843975,"node_id":"MDQ6VXNlcjQxODQzOTc1","avatar_url":"https://avatars3.githubusercontent.com/u/41843975?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter-es","html_url":"https://github.com/flutter-es","followers_url":"https://api.github.com/users/flutter-es/followers","following_url":"https://api.github.com/users/flutter-es/following{/other_user}","gists_url":"https://api.github.com/users/flutter-es/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter-es/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter-es/subscriptions","organizations_url":"https://api.github.com/users/flutter-es/orgs","repos_url":"https://api.github.com/users/flutter-es/repos","events_url":"https://api.github.com/users/flutter-es/events{/privacy}","received_events_url":"https://api.github.com/users/flutter-es/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/flutter-es/website","description":"Flutter web en español (trabajo en proceso)","fork":true,"url":"https://api.github.com/repos/flutter-es/website","forks_url":"https://api.github.com/repos/flutter-es/website/forks","keys_url":"https://api.github.com/repos/flutter-es/website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/flutter-es/website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/flutter-es/website/teams","hooks_url":"https://api.github.com/repos/flutter-es/website/hooks","issue_events_url":"https://api.github.com/repos/flutter-es/website/issues/events{/number}","events_url":"https://api.github.com/repos/flutter-es/website/events","assignees_url":"https://api.github.com/repos/flutter-es/website/assignees{/user}","branches_url":"https://api.github.com/repos/flutter-es/website/branches{/branch}","tags_url":"https://api.github.com/repos/flutter-es/website/tags","blobs_url":"https://api.github.com/repos/flutter-es/website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/flutter-es/website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/flutter-es/website/git/refs{/sha}","trees_url":"https://api.github.com/repos/flutter-es/website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/flutter-es/website/statuses/{sha}","languages_url":"https://api.github.com/repos/flutter-es/website/languages","stargazers_url":"https://api.github.com/repos/flutter-es/website/stargazers","contributors_url":"https://api.github.com/repos/flutter-es/website/contributors","subscribers_url":"https://api.github.com/repos/flutter-es/website/subscribers","subscription_url":"https://api.github.com/repos/flutter-es/website/subscription","commits_url":"https://api.github.com/repos/flutter-es/website/commits{/sha}","git_commits_url":"https://api.github.com/repos/flutter-es/website/git/commits{/sha}","comments_url":"https://api.github.com/repos/flutter-es/website/comments{/number}","issue_comment_url":"https://api.github.com/repos/flutter-es/website/issues/comments{/number}","contents_url":"https://api.github.com/repos/flutter-es/website/contents/{+path}","compare_url":"https://api.github.com/repos/flutter-es/website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/flutter-es/website/merges","archive_url":"https://api.github.com/repos/flutter-es/website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/flutter-es/website/downloads","issues_url":"https://api.github.com/repos/flutter-es/website/issues{/number}","pulls_url":"https://api.github.com/repos/flutter-es/website/pulls{/number}","milestones_url":"https://api.github.com/repos/flutter-es/website/milestones{/number}","notifications_url":"https://api.github.com/repos/flutter-es/website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/flutter-es/website/labels{/name}","releases_url":"https://api.github.com/repos/flutter-es/website/releases{/id}","deployments_url":"https://api.github.com/repos/flutter-es/website/deployments","created_at":"2018-07-29T00:46:28Z","updated_at":"2018-08-25T05:24:54Z","pushed_at":"2018-08-25T05:38:46Z","git_url":"git://github.com/flutter-es/website.git","ssh_url":"git@github.com:flutter-es/website.git","clone_url":"https://github.com/flutter-es/website.git","svn_url":"https://github.com/flutter-es/website","homepage":"https://flutter-es.firebaseapp.com/","size":79637,"stargazers_count":17,"watchers_count":17,"language":"Dart","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":86,"license":null,"forks":1,"open_issues":86,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/flutter-es/website/pulls/250"},"html":{"href":"https://github.com/flutter-es/website/pull/250"},"issue":{"href":"https://api.github.com/repos/flutter-es/website/issues/250"},"comments":{"href":"https://api.github.com/repos/flutter-es/website/issues/250/comments"},"review_comments":{"href":"https://api.github.com/repos/flutter-es/website/pulls/250/comments"},"review_comment":{"href":"https://api.github.com/repos/flutter-es/website/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/flutter-es/website/pulls/250/commits"},"statuses":{"href":"https://api.github.com/repos/flutter-es/website/statuses/8db2e0e2de8f7d14952d072d7410e5b02145e89e"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"Twinber"}}