Documentos de Académico
Documentos de Profesional
Documentos de Cultura
com
Cuando instala Android Studio, el instalador puede ofrecerle la opción de crear un AVD
para que lo use. Si no se le ofreció esta opción, o si omitió la opción, puede crear un AVD
usando la herramienta AVD Manager. De hecho, puede crear varios AVD adicionales y
usar varios AVD diferentes para ejecutar y probar sus aplicaciones Flutter en el emulador
de Android.
Para abrir AVD Manager, vaya a la barra de menú principal de Android Studio y seleccione
Tools-AVD Manager. Las figuras 2-12 a 2-15 muestran los cuadros de diálogo que puede
encontrar en AVD Manager.
FIGURA 2-12:
la pagina inicial
de la AVD
Gerente.
FIGURA 2-13:
la primera pagina
en la creación de un
AVD nuevo.
48 PARTE 1preparándose
FIGURA 2-14:
la segunda pagina
en la creación de un
AVD nuevo.
FIGURA 2-15:
la pagina final
en la creación de un
AVD nuevo.
Soy reacio a enumerar las instrucciones para usar AVD Manager, porque el aspecto de la
herramienta AVD Manager cambia constantemente. Lo más probable es que lo que ve en la
pantalla de su computadora no se parezca mucho a las capturas de pantalla de mediados de
2019 en las Figuras 2-12 a 2-15.
A veces, cuando me siento mal, voy al médico. Si tiene problemas para ejecutar
aplicaciones y cree que su instalación de Flutter está enferma, puede llevar a Flutter al
médico. Así es cómo:
1.En Android Studio, inicie un nuevo proyecto de Flutter o abra un proyecto existente.
Para obtener ayuda con eso, consulte la sección "Ejecución de su primera aplicación" de este capítulo.
El informe de Flutter Doctor no siempre es útil. Algunos de los hallazgos del informe
pueden ser falsas alarmas. Otros pueden ser difíciles de interpretar. Si ve algo que parece
un diagnóstico útil, pruébelo. Muchos de los consejos del médico implican abrir una
ventana de Terminal o Símbolo del sistema. Encontrarás consejos al respecto en la barra
lateral "Tu amigo, la línea de comandos".
Pero, por desgracia, las interfaces de línea de comandos no han desaparecido. Algunas tareas aún requieren comandos
escritos a máquina largos y crípticos, y algunas personas prefieren escribir comandos en lugar de hacer clic en los botones.
50 PARTE 1preparándose
La mayoría de las instrucciones de este libro requieren señalar y hacer clic. Pero, aquí y allá, hay que
hacer las cosas a la antigua. Para ayudarlo a sobrevivir a la miseria inimaginable de escribir comandos
enigmáticos y propensos a errores, proporciono algunos consejos:
Si se está ejecutando Android Studio, puede abrir la Terminal de Mac o el símbolo del sistema de
Windows haciendo clic en el pequeño botón de la herramienta Terminal cerca de la parte inferior de la
• En una Mac, siempre puede abrir la Terminal de Mac presionando Comando+espacio, escribiendo
Terminaly luego presionando Entrar.
En Windows, siempre puede abrir el Símbolo del sistema presionando Inicio, escribiendo
cmdy luego presionando Entrar.
• En cualquier momento, una ventana de terminal o símbolo del sistema tiene undirectorio de
trabajo. Por ejemplo, si el directorio de trabajo es /Usuarios/isaacnewton/Documentos,y
tu escribesmás miarchivo.txt,la computadora busca en el /Usuarios/isaacnewton/
Documentosdirectorio para un archivo llamadomiarchivo.txt.Si el /Usuarios/isaacnewton/
Documentosdirectorio tiene un archivo llamadomiarchivo.txt,la computadora muestra el contenido de
(En Windows):Para averiguar qué directorio es el directorio de trabajo, mire el aviso o escribadiscos
compactos. Para cambiar el directorio de trabajo, escribadiscos compactosseguido del nombre del nuevo
directorio.
c:\Usuarios\isaacnewton\Documentos>discos
compactos c:\Usuarios\isaacnewton\Documentos
c:\Usuarios\isaacnewton\Documentos>cd c:\Usuarios\isaacnewton
c:\Usuarios\isaacnewton>discos
compactos c:\Usuarios\isaacnewton
• (En una Mac):Para averiguar qué directorio es el directorio de trabajo, escribapwd.Para cambiar el
discapacidad /Usuarios/isaacnewton/Documentos
discapacidad /Usuarios/isaacnewton
Estimado Barry,
He seguido todas tus instrucciones. Las cosas van bien hasta que intento ejecutar una aplicación. El
firmado,
Bueno, Sra. Freezing, el emulador que viene con Android Studio consume muchos
recursos en su computadora de desarrollo. Si es como yo y no siempre tiene el hardware
más reciente y potente, es posible que tenga problemas para ejecutar aplicaciones en el
emulador. Tal vez no vea la pantalla de inicio de Android o no vea su aplicación
ejecutándose cinco minutos después de que el emulador comience a ejecutarse. Si es así,
aquí hay varias cosas que puede probar:
52 PARTE 1preparándose
»Si tiene acceso a una computadora con más RAM, intente ejecutar su aplicación
en eso.
»Si no tiene acceso a una computadora con más RAM, cierre todos los que no sean
programas esenciales en su computadora de desarrollo e intente ejecutar su
aplicación nuevamente.
Cuando se ejecuta en un procesador Intel x86, el emulador de Android intenta usar algo
llamado Intel Virtualization Technology (VT) con Intel Hardware Accelerated Execution
Manager (HAXM). Si su computadora no se siente completamente cómoda con una
configuración de VT y HAXM, es probable que tenga problemas para usar el emulador de
Android.
La lista con viñetas anterior describe algunos remedios para problemas con el emulador
de Android Studio. Desafortunadamente, ninguna de las balas en esta lista es una bala de
plata. Si probó estos trucos y aún tiene problemas, puede intentar abandonar el
emulador que viene con Android Studio y ejecutar aplicaciones en un dispositivo "real".
https://flutter.dev/docs/get-started/install/macos - deployment-to-ios-devices
https://flutter.dev/docs/get-started/install/windows - configure-su-dispositivo-android
Acerca de, toque el elemento Número de compilación siete veces. (Sí, siete veces). Luego presione el
botón Atrás para regresar a la lista de Configuración. En la lista Configuración, toque Sistema-
Opciones de desarrollador.
seguridad, desactiva la depuración de USB cuando no estés usando el dispositivo para desarrollar
aplicaciones.
54 PARTE 1preparándose
4.Con un cable USB, conecte el dispositivo a la computadora de desarrollo.
No todos los cables USB son iguales. Unos cables, llamadoscables de datos, tienen
alambres y metal en lugares donde otros cables, llamadoscables de carga, no tienen nada
excepto plástico. Intente usar el cable USB que viene con su dispositivo. Si, como yo, no
puede encontrar el cable que vino con su dispositivo o no sabe qué cable vino con su
dispositivo, pruebe con más de un cable. Cuando encuentre un cable que funcione,
etiquételo. (Si el cablesiemprefunciona, etiquételo como "cable estable").
COMPROBACIÓN DE LA CONEXIÓN Y
ROTURA DE LA CONEXIÓN
Para saber si su teléfono Android está correctamente conectado a su computadora de
desarrollo, siga estos pasos:
1. Abra la Terminal en una Mac o el símbolo del sistema en Windows. Para obtener más
cd %HOMEDRIVE%%HOMEPATH%\AppData\Local\Android\Sdk\plataforma-herramientas
En mi Mac, escribo
cd ~/Biblioteca/Android/sdk/plataforma-herramientas/
(continuado)
dispositivo emulator-5554
dispositivo emulator-5556
2885046445FF097 dispositivo
Si intenta expulsar el dispositivo y ve el temido mensaje No es seguro quitar el dispositivo, comience siguiendo
los pasos 1 y 2 en esta barra lateral. A continuación, realice una de las siguientes acciones:
. /adb matar-servidor
• En Windows, escriba
adb matar-servidor
56 PARTE 1preparándose
Preparándose para probar en un iPhone
actualización de cerveza
¿No fue divertido? Se tarda mucho tiempo en obtener respuestas y probablemente vea
mensajes de advertencia aterradores en el camino.
Las instrucciones de este paso están actualizadas a partir del 23 de agosto de 2019 a las 10:05 a.
m., horario de verano del Este. Después de ese momento, no hago promesas. Si te quedas
atascado, consulta la web o envíame un email.
Después de estos tres pasos, su computadora de desarrollo está lista para funcionar. Sigue estos
pasos siempre que quieras probar una nueva aplicación de Flutter en un iPhone físico:
No todos los cables son iguales. Apple pone un chip patentado en cada uno de los cables de su
iPhone. Si compra su cable a un proveedor externo, es posible que no pueda usarlo para
transferir una aplicación a su teléfono.
Android Studio. Si tiene problemas para encontrarlo, salte a la sección titulada "La ventana de la
4.Expande una de las ramas más altas del árbol para encontrar una rama secundaria llamadaiOS.
5.Haga clic derecho en eliOSsubdelegación. En el menú contextual resultante,
seleccione Flutter-Abra el módulo iOS en Xcode.
Como resultado, se inicia Xcode. Hay un árbol de archivos y carpetas en el lado izquierdo de la
ventana de Xcode.
FIGURA 2-16:
quien es baya
Burd?
7.Seleccione la pestaña Firma y capacidades cerca de la parte superior de la ventana de Xcode. (De
nuevo, consulte la Figura 2-16.)
9.Haga lo que tenga que hacer en el cuadro de diálogo Cuentas y luego cierre el cuadro
de diálogo.
58 PARTE 1preparándose
Pruebas en cualquier dispositivo físico (Android o iPhone)
Cuando esté listo para probar su aplicación en un dispositivo físico y haya conectado el dispositivo a su
computadora de desarrollo, consulte la lista desplegable Selector de destino en la barra de
herramientas de Android Studio. Cuando su computadora de desarrollo se comunica correctamente
con el dispositivo físico, el nombre del dispositivo aparece como uno de los elementos de esta lista
desplegable. (Consulte la Figura 2-17). Seleccione este elemento y luego haga clic en el icono Ejecutar.
FIGURA 2-17:
mi iPhone es
¡conectado!
En esta sección, obtendrá una descripción general de la ventana principal de Android Studio. Me
centro en las funciones más útiles que te ayudan a crear aplicaciones de Flutter, pero ten en cuenta
que Android Studio tiene cientos de funciones y muchas formas de acceder a cada función.
Empezando
Cada aplicación de Flutter pertenece a un proyecto. Puede tener docenas de proyectos en el
disco duro de su computadora. Cuando ejecuta Android Studio, cada uno de sus proyectos está
abierto o cerrado. Unabiertoproyecto aparece en una ventana (su propia ventana) en la pantalla
de su computadora. Acerradoproyecto no aparece en una ventana.
Varios de sus proyectos pueden estar abiertos al mismo tiempo. Puede cambiar entre
proyectos moviéndose de ventana a ventana.
Si se está ejecutando Android Studio y no hay proyectos abiertos, Android Studio muestra su pantalla
de bienvenida. (Consulte la Figura 2-2.) La pantalla de Bienvenida puede mostrar algunos
Si tiene proyectos abiertos, Android Studio no muestra la pantalla de bienvenida. En ese caso,
puede abrir otro proyecto seleccionando Archivo-Abrir o Archivo-Abrir reciente en la ventana de
un proyecto abierto. Para cerrar un proyecto, puede elegir Archivo-Cerrar proyecto, o puede
hacer lo que normalmente hace para cerrar una de las ventanas de su computadora. (En una
PC, haga clic en la X en la esquina superior derecha de la ventana. En una Mac, haga clic en el
pequeño botón rojo en la esquina superior izquierda de la ventana).
Android Studio recuerda qué proyectos estaban abiertos de una ejecución a la siguiente. Si hay algún
proyecto abierto cuando sale de Android Studio, esos proyectos se abrirán nuevamente (con sus
ventanas principales visibles) la próxima vez que inicie Android Studio. Puede anular este
comportamiento (para que solo aparezca la pantalla de bienvenida cada vez que inicie Android
Studio). En Android Studio en una computadora con Windows, comience seleccionando Archivo-
Configuración-Apariencia y comportamiento-Configuración del sistema. En Android Studio en una
Mac, seleccione Android Studio- Preferencias- Apariencia y comportamiento- Configuración del
sistema. En cualquier caso, desactive la casilla de verificación Reabrir último proyecto al iniciar.
la ventana principal
La ventana principal de Android Studio está dividida en varias áreas. Algunas de estas áreas pueden
aparecer y desaparecer según sus órdenes. Lo que sigue es una descripción de las áreas en la Figura
2-18, moviéndose desde la parte superior de la ventana principal hasta la parte inferior.
FIGURA 2-18:
la ventana principal
tiene varias zonas.
60 PARTE 1preparándose
Las áreas que ve en la pantalla de su computadora pueden ser diferentes de las áreas de la Figura 2-18. Por lo
general, eso está bien. Puede hacer que las áreas aparezcan y desaparezcan eligiendo ciertas opciones de
menú, incluida la opción Ver en la barra de menú principal de Android Studio. También puede hacer clic en los
pequeños botones de herramientas en los bordes de la ventana principal.
Puede leer más sobre estos elementos anteriormente, en la sección "Ejecución de su primera
»La barra de navegación muestra la ruta a uno de los archivos en su proyecto Flutter.
Un proyecto de Flutter contiene muchos archivos y, en un momento determinado, trabajas en
uno de estos archivos. La barra de navegación apunta a ese archivo.
Debajo del menú principal y las barras de herramientas, verá dos áreas diferentes. El área de la
izquierda contiene elventana de herramientas de proyecto,que usa para navegar de un archivo a otro
dentro de su aplicación de Android.
En un momento dado, la ventana de la herramienta Proyecto muestra una de varias vistas posibles.
Por ejemplo, en la Figura 2-18, la ventana de la herramienta Proyecto muestra su vista del proyecto. En
la Figura 2-19, hago clic en la lista desplegable y selecciono la vista Paquetes (en lugar de la vista
Proyecto).
FIGURA 2-19:
Seleccionando
Vista de paquetes.
El área de redacción
El área del Editor puede tener varias pestañas. Cada pestaña contiene un archivo que está abierto para editar.
Para abrir un archivo para editarlo, haga doble clic en la rama del archivo en la ventana de la herramienta
Proyecto. Para cerrar el archivo, haga clic en la pequeña x junto al nombre del archivo en la pestaña Editor.
la zona baja
Debajo de la ventana de herramientas Proyecto y el área del Editor hay otra área que contiene varias ventanas
de herramientas. Cuando no esté utilizando ninguna de estas ventanas de herramientas, es posible que no
vea esta área inferior.
En el área inferior, la ventana de herramientas que uso con más frecuencia es la ventana de herramientas
Ejecutar. (Consulte la parte inferior de la Figura 2-18.) La ventana de la herramienta Ejecutar aparece
automáticamente al hacer clic en el icono Ejecutar. Esta ventana de herramientas muestra información sobre
la ejecución de una aplicación Flutter. Si su aplicación no se ejecuta correctamente, la ventana de la
herramienta Ejecutar puede contener información de diagnóstico útil.
Puede hacer que aparezcan otras ventanas de herramientas en el área inferior haciendo clic en los botones de
herramientas cerca de la parte inferior de la ventana de Android Studio. Por ejemplo, cuando hace clic en el
botón de la herramienta Terminal, Android Studio muestra el Símbolo del sistema de Windows, la aplicación
Terminal de Mac u otra pantalla de comando basada en texto que especifique. Para obtener más información,
consulte la barra lateral anterior "Tu amigo, la línea de comandos".
Es posible que un botón de herramienta en particular no aparezca cuando no hay nada que pueda hacer con
él. Por ejemplo, es posible que el botón de la herramienta Ejecutar no aparezca hasta que presione el ícono
Ejecutar. No te preocupes por eso. El botón de la herramienta aparece siempre que lo necesite.
62 PARTE 1preparándose
la barra de estado
La barra de estado le dice lo que está sucediendo ahora. Por ejemplo, si el cursor está en el carácter 37
de la línea 11 en el editor, verá11:37en algún lugar de la línea de estado. Cuando le dice a Android
Studio que ejecute su aplicación, la barra de estado contiene el mensaje más reciente de la ventana de
la herramienta Ejecutar.
El lavabo de la cocina
Además de las áreas que menciono en esta sección, pueden surgir otras áreas a medida que
surja la necesidad. Puede descartar un área haciendo clic en el icono Ocultar del área. (Vea la
Figura 2-20.)
FIGURA 2-20:
Ocultar el proyecto
área de la ventana de herramientas.
Este libro tiene docenas de aplicaciones Flutter de muestra, y todas están disponibles para descargar
desde el sitio web del libro:https://allmycode.com/Flutter.Puede ejecutar cualquiera de estos
programas como parte de una aplicación Android Studio Flutter. Esta sección tiene todos los detalles.
Lo que haga a continuación depende de lo que vea cuando inicie Android Studio.
2.Si ve la pantalla de bienvenida de Android Studio (consulte la Figura 2-2), seleccione Iniciar
un nuevo proyecto de Flutter.
Si ve otra ventana de Android Studio con una opción Archivo en la barra de menú
principal, elija Archivo-Nuevo-Nuevo proyecto Flutter en la barra de menú principal.
De cualquier manera, aparece el primer cuadro de diálogo para crear un nuevo proyecto de Flutter.
4.En la ventana de la herramienta Proyecto de Android Studio, busque una carpeta llamadaliberación.
Si necesita ayuda para encontrar esa ventana de herramientas, consulte la sección "Ventana de herramientas del
La ventana de la herramienta Proyecto contiene un árbol de carpetas y archivos. Expande una de las
ramas más altas del árbol para encontrar elliberacióncarpeta. Esteliberacióncontiene el código Dart de
su proyecto.
A lo largo de este libro, escribobotón derecho del ratóncomo si todo el mundo tuviera un ratón
con dos o más botones. Si es un usuario de Mac y su mouse tiene solo un botón, presione
Control + clic donde vea el términobotón derecho del ratón.
Para obtener más información, consulte la barra lateral anterior "Archivos comprimidos".
una carpeta llamadaDescargas.La mayoría de los navegadores web ponen cosas dentro
Descargaspor defecto.
Safari en una Mac generalmente descomprime.Código PostalLos archivos se archivan automáticamente y los
navegadores de Windows (Internet Explorer, Firefox, Chrome y otros) no descomprimen los archivos .Código
Postalarchiva automáticamente. Para obtener información completa sobre los archivos de almacenamiento,
Para este experimento, le sugiero que busque elApp0201.dardoexpediente. (Ningún código aparece
en ninguna parte de este capítulo. Entonces, en este caso inusual,0201no se refiere a un proyecto cuyo
código se encuentra en el Listado 2-1).
64 PARTE 1preparándose
9.Haga clic derecho en el vacío del nuevo proyectoliberacióncarpeta. En el menú contextual resultante,
seleccione Pegar.
Si Android Studio muestra un cuadro de diálogo que ofrece pegar en un directorio en particular,
asegúrese de que el nombre completo del directorio termine enliberaciónLuego, presione Aceptar.
Ahora está listo para ejecutar uno de los ejemplos de este libro. ¡Ve a por ello!
La segunda vez que ejecuta un ejemplo particular de este libro, no tiene que seguir todos
los pasos de la sección anterior. Es fácil ejecutar un ejemplo una y otra vez. Puede realizar
cambios en el código y luego hacer clic en el ícono Ejecutar nuevamente. Eso es todo lo
que tienes que hacer.
Si eres quisquilloso. . .
Después de seguir los pasos de la sección anterior, es posible que vea algunos marcadores de
error (subrayados rojos y ondulados) en la ventana de la herramienta Proyecto. El proyecto
Flutter de muestra de Android Studio describe algo llamadomi aplicación,pero el código que
copiaste en elliberacióncarpeta no hace mención deMiAplicación.Puede ejecutar este proyecto
una y otra vez sin corregir los subrayados rojos ondulados. Pero si desea solucionarlos,
simplemente siga estos pasos:
2.Borrar elwidget_test.dartexpediente.
Los subrayados rojos ondulados se han ido. ¡Problema resuelto!
Otra forma de deshacerse de los subrayados rojos ondulados es saltar a una máquina del
tiempo y rehacer las instrucciones en la sección "Ejecución de los programas de muestra de
este libro". Si ignora el paso 5 y no eliminadardo principal,no obtendrás esos subrayados
rojos. Pero es posible que tenga que lidiar con otros dos problemas. El comportamiento del
icono Ejecutar puede volverse un poco confuso. Además, puedes crear una grieta en el
continuo espacio-tiempo y convertirte en tu propio abuelo.
Si todo el jibber-jabber en este capítulo lo llevó al punto en el que está listo para aprender
Flutter, ¡genial! Pero si todavía tiene dificultades para que el software funcione, escríbame. Mi
información de contacto está en la introducción del libro. Estaré encantado de ayudar.
66 PARTE 1preparándose
2
Flutter: A Burd's-
Vista de ojo
EN ESTA PARTE . . .
Capítulo 3
"Hola" de Flutter
♪“Hola debo irme"♪
BERT KALMAR Y HARRY RUBY, CANTADAS POR GROUCHO MARX,
ENGALLETAS DE ANIMALES,1930
T
el palabraHolaes relativamente nuevo en el idioma inglés. Su primer uso conocido
impreso fue en Norwich, Connecticut,mensajeroen 1826. Alexander Graham Bell,
el inventor del teléfono, creía que las llamadas telefónicas debían comenzar con el
término¡Ay!pero, al parecer, Thomas Edison prefirióHola,y las primeras guías telefónicas
recomendaban la elección de Edison.
Según la leyenda, el primer programa de computadora que imprimió nada más que "¡Hola,
mundo!" fue escrito por Brian Kernighan, como parte de la documentación del lenguaje de
programación BCPL. La primera aparición pública de un programa de este tipo fue en el libro
de Kernighan y Ritchie de 1972,El lenguaje de programación C. En la actualidad, el término
programa hola mundo,o simplementehola programa,se aplica a cualquier código simple y sucio
para la primera exposición de alguien a un nuevo lenguaje o nuevo marco.
Este capítulo presenta un programa Flutter simple "Hola mundo" y varios adornos. Puede
ejecutar el código, diseccionarlo, cambiarlo y divertirse con él.
Lo primero es lo primero
Puede descargar el código de esta aplicación (y el código de todos los demás listados en este
libro) desde mi sitio web. la URL eshttps://allmycode.com/Flutter.Puede encontrar
instrucciones detalladas para ejecutar el código en el Capítulo 2.
Como de costumbre, Android Studio crea un archivo lleno de código Dart para ti. el nombre del archivo
esdardo principal
La Figura 3-2 le muestra lo que ve cuando ejecuta la aplicación Flutter en el Listado 3-1. La aplicación
se ve bastante mal, pero al menos puedes ver el pequeño¡Hola Mundo!en la esquina superior
izquierda de la pantalla. Me ocuparé de los aspectos estéticos de la aplicación más adelante en este
capítulo.
FIGURA 3-2:
Ejecutando el código
en el Listado 3-1.
Es posible que vea marcadores rojos en el editor de Android Studio. Si lo hace, coloque el cursor
sobre un marcador y lea la explicación que aparece. Algunas explicaciones son fáciles de
entender; otros no lo son. Cuanta más práctica tenga en la interpretación de estos mensajes,
más hábil se volverá para solucionar los problemas.
Otra cosa que puede intentar es seleccionar la pestaña Dart Analysis en la parte inferior de la
ventana principal de Android Studio. Esta pestaña enumera muchos de los puntos de su
proyecto que contienen código cuestionable. Para cualquier elemento de la lista, un icono rojo
indica un error, algo que debe corregirse. (Si no lo soluciona, su aplicación no podrá
ejecutarse). Cualquier otro ícono de color indica una advertencia, algo que no evitará que su
código se ejecute, pero que podría valer la pena considerar.
En las próximas secciones, desmontaré el código del Listado 3-1. Exploro el código desde
muchos puntos de vista. Explico lo que hace el código, por qué hace lo que hace y qué
podría hacer de manera diferente.
FIGURA 3-3:
El panorama.
Un programa de Flutter es como un conjunto de muñecas rusas matryoshka. Es una cosa dentro de
una cosa dentro de otra cosa, y así sucesivamente, hasta llegar a un punto final. (Consulte la Figura
3-4.)
FIGURA 3-4:
El look en capas.
»El código
Texto("¡Hola mundo!")
»El código
Material(
niño:Texto("¡Hola mundo!"),
)
FIGURA 3-5:
Cada constructor
llamada crea un
objeto.
AMaterialobjeto tiene algunas de las características que podría tener el material físico,
como una pieza de tela. Tiene una forma determinada. Puede estar elevado desde la
superficie debajo de él. Puedes moverlo o pellizcarlo. Por supuesto, el fondo de la figura
3-2 no se parece mucho a un trozo de tela. Pero imitar la textura de la tela no es el objetivo
de Material Design. El objetivo de Material Design es crear un lenguaje para describir el
estado de los componentes en la pantalla de un usuario y describir cómo estos
componentes se relacionan entre sí.
hogar:Material(
niño: Texto("¡Hola mundo!"),
),
)
En esa oración, el uso aparentemente inocente de las palabras "tiene un" es importante. Para obtener
más detalles, consulte la sección posterior "Un breve tratado sobre la interioridad".
Para comprender el código del Listado 3-1, debe saber dónde comienzan y terminan los pares de
paréntesis. Pero encontrar las coincidencias entre paréntesis abiertos y cerrados no siempre es fácil.
Para ayudar con este problema, Android Studio tiene algunos trucos bajo la manga virtual. Si coloca el
cursor cerca de un carácter de paréntesis, Android Studio resalta el paréntesis correspondiente.
Además, puede visitar el cuadro de diálogo Configuración o Preferencias de Android Studio. (En
Windows, seleccione Archivo- Configuración. En una Mac, seleccione Android Studio- Preferencias). En
ese cuadro de diálogo, seleccione Editor-General- Apariencia y coloque una marca de verificación en la
casilla de verificación Mostrar etiquetas de cierre en el código fuente de Dart. Después de descartar el
cuadro de diálogo, Android Studio muestra comentarios que marcan el final de muchas llamadas al
constructor. (Observe las etiquetas
// Materialy //MaterialAppen la Figura 3-6.)
FIGURA 3-6:
Cierre útil
etiquetas.
FIGURA 3-7:
Llamadas de constructor
tener parámetros.
Las llamadas de constructor pueden tener muchos parámetros o no tener parámetros. Tomemos, por
ejemplo, elTextollame en el Listado 3-1. En ese código, el parámetro "¡Hola Mundo!"
proporciona información a Dart, información que es específica delTextowidget que Dart
está construyendo. Intenta cambiarTexto("¡Hola mundo!")aText("¡Hola mundo!",
textScaleFactor: 4.0).Cuando guarda el nuevo código, Android Studio realiza un reinicio
en caliente que cambia el aspecto de la aplicación en su emulador. (Consulte la Figura
3-8.)
FIGURA 3-8:
Una aplicación fea para
ilustrar el
textScaleFactor
parámetro
efecto.
El Capítulo 1 describe la diferencia entre las funciones de reinicio en caliente y recarga en caliente de Flutter. Ambas
funciones aplican actualizaciones a una aplicación mientras se ejecuta. Para hacer un reinicio en caliente, simplemente
guarde su código. Para realizar una recarga en caliente, presione el ícono Ejecutar cerca de la parte superior de la
puntos. ATextoLa llamada al constructor puede tener muchos parámetros con nombre diferentes, como
factor de escala de texto, estilo,ylineas maximas.Puede escribir los parámetros con nombre en
cualquier orden, siempre que estén después de cualquiera de los parámetros posicionales.
Sin comas finales, su código se ejecuta como se esperaba. Pero la siguiente sección le
dice cómo puede obtener Android Studio para que su código se vea bien. Y, sin comas
finales, Android Studio no da lo mejor de sí.
Un par de barras (//) tiene un significado especial en Dart. Para saber de qué se trata, consulte el
Capítulo 4.
Si cambia la sangría en un programa Dart, el programa aún se ejecuta. Aquí hay una
reelaboración válida del código en el Listado 3-1.
devolver MaterialApp(
casa: Material(
Cuando le pide a Android Studio que ejecute este código mal sangrado, funciona. Android
Studio ejecuta diligentemente el código en su dispositivo virtual o físico. Pero ejecutar
este código no es suficiente.Este código mal sangrado es horrible. Es casi imposible de
leer.La sangría, o la falta de ella, no le da ninguna indicación de la estructura del
programa. Tienes que vadear las palabras para descubrir que elMaterial
el widget está dentro delMateralAppartilugio. En lugar de mostrarte la estructura de la aplicación de
un vistazo, este código hace que tus ojos deambulen sin rumbo en un mar de comandos
aparentemente no relacionados.
La buena noticia es que no tiene que aprender a sangrar su código. Android Studio puede
hacer la sangría por ti. Así es cómo:
2.En ese cuadro de diálogo, seleccione Idiomas y marcos-Flutter y luego coloque una marca
de verificación en la casilla de verificación Format Code on Save.
La marca de verificación le dice a Android Studio que corrija la sangría de su código cada vez
que guarde su trabajo.
Mientras lo hace, también podría poner una marca de verificación en la siguiente casilla de verificación: la casilla
Si desea tener más control sobre el comportamiento de Android Studio, no juegue con el
cuadro de diálogo Configuración o Preferencias. En su lugar, cada vez que desee que se corrija
la sangría, coloque el cursor en el panel Editor y luego elija Code-Reformat Code en el menú
principal de Android Studio.
»Un objeto es una cosa de algún tipo. Cada objeto pertenece a un particular.
clase de cosas.
La palabraTextoes el nombre de una clase de cosas, cosas que contienen caracteres que se
mostrarán en la pantalla. Por sí sola, una clase no hace mucho. El hecho de que Flutter tenga
unTextoclass no significa nada para una aplicación que muestra imágenes y no caracteres.
Puedes hablar de la clase de todos los unicornios, pero nunca he visto un unicornio en mi
patio delantero.
Cada instancia de la clase Cat es, por definición, una instancia de la clase Animal. (Si
eso no fuera cierto, millones de videos de YouTube no existirían). ¿Y qué pasa con la
clase Animal? Cada instancia de la clase Animal es una instancia de la clase
LivingThing. (Vea la Figura 3-9.)
FIGURA 3-9:
tengo que mencionar
gatos en alguna parte
en este libro.
»En Flutter, casi todos los objetos son, de una forma u otra, una instancia de
laWidgetclase.
La línea
»Las relaciones que describo en la sección "¿De qué se trata?" sección son
relaciones “tiene una”.
No hay nada especial en las relaciones "tiene un". Puede haber relaciones
"tiene un" en un corral. Un gato tiene un ratón y el ratón tiene un trozo
de queso.
Si tiene hambre de terminología que sea más formal que "tiene un" y "es un", tengo algo
para usted:
Por frívolo que sea, el diagrama de la figura 3-4 ilustra una jerarquía de
composición.
En Flutter, casi todo se llama "widget". Muchas clases son widgets. Cuando una clase es un
widget, las instancias de la clase (cualquier objeto construido a partir de esa clase) también se
denominan widgets.
La documentación es tu amiga.
Quizás te estés preguntando cómo vas a memorizar todos estos nombres:Texto,
StatelessWidget, MaterialApp,y probablemente miles más. Siento decirlo, estás
haciendo la pregunta equivocada. No memorizas nada. Cuando usa un nombre con la
suficiente frecuencia, lo recuerda de forma natural. Cuando no recuerda un nombre, lo
busca en los documentos en línea de Flutter. (A veces, no está seguro de dónde buscar el
nombre que desea. En ese caso, debe hurgar un poco).
FIGURA 3-10:
Información útil sobre
la clase Texto.
Esta página enumera los parámetros en la llamada del constructor y proporciona otra
información útil.
En la página de la Figura 3-11, observe cómo todos menos uno de los parámetros del
constructor están encerrados entre un par de llaves. El parámetro que no está entre llaves (es
decir,cadena de datos)es el único parámetro posicional del constructor. Cada uno de los
parámetros dentro de las llaves (incluyendofactor de escala de texto doble)es un parámetro
con nombre.
Siempre puedes contar con la documentación de Flutter para saber qué tipos de objetos
puedes y no puedes poner dentro de otros objetos. Por ejemplo, el siguiente código está
condenado al fracaso:
devolver MaterialApp(
niño: Texto("¡Hola mundo!"),//¡No hagas esto!
);
La aplicación que se muestra en la Figura 3-2 se ve bastante mal. Las palabras¡Hola Mundo!están
metidos contra la esquina superior izquierda de la pantalla. Afortunadamente, Flutter ofrece una
manera fácil de arreglar esto: rodeas elTextoartilugio con unCentroartilugio. Como su nombre lo
indica, elCentrowidget centra lo que sea que esté dentro de él.
Tienes algunas maneras de rodear unTextocódigo del widget con unCentrocódigo del widget.
Una forma es empujar el cursor en algún lugar dentro del editor de Android Studio, comenzar a
escribir y esperar que navegue por la maraña de paréntesis correctamente. Una mejor manera
es hacer lo siguiente:
En algunas situaciones, el reinicio en caliente no funciona. En lugar de actualizar su aplicación, Android Studio
muestra un mensaje de error. Si eso sucede, intente una recarga en caliente. (Presione el ícono Ejecutar cerca
de la parte superior de la ventana principal de Android Studio). ¿Y si falla la recarga en caliente? En ese caso,
presione el ícono Detener, el ícono cuadrado rojo que está en la misma fila que el ícono Ejecutar. Cuando
presiona el ícono Detener, la ejecución de su aplicación finaliza por completo. Presionar el ícono Ejecutar para
comenzar de nuevo puede solucionar el problema.
La Figura 3-12 muestra lo que obtiene cuando ejecuta el código del Listado 3-2.
FIGURA 3-12:
Sí, has
centrado el texto.
FIGURA 3-13:
¡Mirad! A
¡andamio!
En este capítulo, los Listados 3-1 y 3-2 tienenMaterialwidgets, y el Listado 3-3 tiene un
Andamio.Estos widgets forman los fondos de sus respectivas aplicaciones. Si quitas el
Materialwidget del Listado 3-1 o 3-2, la pantalla de su aplicación se convierte en un
desastre. Obtiene letras rojas grandes con subrayados amarillos sobre un fondo negro.
Lo mismo sucede cuando quitas elAndamiodel Listado 3-3. Existen otros widgets que
pueden proporcionar fondos para sus aplicaciones, peroMaterialyAndamioson los más
utilizados.
FIGURA 3-15:
un ligero cambio
desde la pantalla
en la Figura 3-13.
En el lenguaje de diseño de materiales de Google, imagina que el fondo descansa sobre una
superficie plana y que otros componentes se elevan sobre el fondo en una cierta cantidad de
píxeles. Por unbarra de aplicaciones,la elevación predeterminada es 4, pero puede cambiar la
elevación de una barra con . . . espéralo . . laelevaciónparámetro.
Para conocer todos los detalles sobre la propiedad de elevación de Material Design, visitehttps://
material.io/design/environment/elevation.html.
Una característica interesante del lenguaje de programación Dart se esconde dentro del Listado
3-4. La palabraBrillose refiere a algo llamadoenumeración (pronunciado “ee-noom”). La
palabraenumeraciónes corto paraenumeración.Unenumeraciónes un montón de valores,
me gustaBrillo.luzyBrillo.oscuro.
En el Listado 3-4, observe cómo se refiere al valor de una enumeración. No usas una
llamada de constructor. En su lugar, utiliza el nombre de la enumeración (comoBrillo),
seguido de un punto, seguido de la parte única del nombre del valor (comoluzooscuro).
inicio: CupertinoPageScaffold(
barra de navegación: CupertinoNavigationBar(),
niño:Centro(
niño: Texto("¡Hola mundo!"),
),
),
);
}
}
El Listado 3-5 es muy parecido a su primo de Material Design, el Listado 3-3. Pero en lugar de
tenerMaterialApp, Andamioybarra de aplicacioneswidgets, el Listado 3-5 tiene la
CupertinoApp, CupertinoPageScaffold,yCupertinoNavegaciónBarwidgets
En lugar de importar 'paquete:flutter/material.dart',Listado de 3-5 importaciones
'paquete:flutter/cupertino.dart'. (Esteimportardeclaración hace que Flutter
La biblioteca de widgets de Cupertino está disponible para que la use el resto del código de la lista).
Los widgets Material Design y Cupertino de Flutter no son completamente paralelos entre sí.
por ejemplo, elAndamioLa llamada al constructor en el Listado 3-3 tiene uncuerpo
parámetro. En lugar de ese parámetro, elCupertinoPáginaAndamioLa llamada al constructor en el
Listado 3-5 tiene unniñoparámetro. En caso de duda, consulte las páginas de documentación oficiales
de Flutter para averiguar qué nombres de parámetros pertenecen a las llamadas del constructor de
los widgets.
Puede mezclar y combinar widgets de Material Design y Cupertino en la misma aplicación. Incluso
puede adaptar el estilo de diseño de su aplicación para diferentes tipos de teléfonos. Incluso puede
poner código del siguiente tipo en su aplicación:
si (Plataforma.isAndroid) {
// Hacer cosas específicas de Android
}
si (Plataforma.isIOS) {
// Hacer cosas específicas de iOS
Mi propio árbol genealógico es bastante simple. Éramos mamá, papá y yo. La gente me
pregunta si me sentía solo siendo hijo único. "¡Diablos no!" Yo digo. “Como hijo único, no tenía
que compartir cosas”.
¿Cómo pones a dos niños en el cuerpo de un andamio? Es posible que tengas la tentación de probar
esto:
// NO HAGAS ESTO:
cuerpo: Centro(
niño:Texto("¡Hola mundo!"),
niño:Otro Widget(...)
)
Pero una llamada de constructor no puede tener dos parámetros con el mismo nombre. ¿Entonces que
puedes hacer?
),
Texto ("Me siento solo dentro de este teléfono").
],
),
),
);
}
}
FIGURA 3-16:
me pregunto quien es
¡ahí!
Una forma de crear una lista es encerrar los objetos entre corchetes. Por ejemplo, el
Listado 3-6 contiene una lista con dos objetos. (Vea la Figura 3-17.)
COSAS DE CUERDA
En el lenguaje de programación Dart, lo que rodeas con comillas (como en "¡Hola
Mundo!")se llama uncuerda. Es un montón de personajes, uno tras otro. Aquí hay
algunos datos útiles sobre las cadenas:
• Para crear una cadena, puede usar comillas dobles o comillas simples.
• Es fácil poner una comilla simple dentro de una cadena entre comillas dobles.
Consulte la cadena
en el Listado 3-6.
• Es fácil poner comillas dobles dentro de una cadena entre comillas simples. Por
• Uso de caracteres de barra invertida (\), puede colocar cualquier tipo de comillas dentro de
cualquier tipo de cadena.
(continuado)
• Para pegar cadenas una detrás de otra, use un signo más (+) o algunos espacios en blanco.
"Hola" + "mundo!"
"¡Hola Mundo!"
Para otras cosas que puede hacer con cadenas, consulte el Capítulo 4.
1.Mientras se ejecuta la aplicación en el Listado 3-6, busque en el borde derecho de la ventana de Android
Studio un botón de la barra de herramientas con las palabrasInspector de aleteo en eso. Haga clic en
FIGURA 3-18:
el aleteo
Inspector.
2.En la esquina superior izquierda del Flutter Inspector, busque el icono Habilitar modo de
selección de widget. (Consulte la Figura 3-18.) Haga clic en ese icono.
3.Seleccione la pestaña Widgets de Flutter Inspector. (Una vez más, consulte la Figura 3-18.)
FIGURA 3-19:
Seleccionando un
rama de
el aleteo
El árbol del inspector.
FIGURA 3-20:
Seleccionar widget
el modo es realmente
¡útil!
5.Solo por diversión, seleccione algunas otras ramas en el árbol de widgets de Flutter
Inspector.
Puede determinar los límites de casi cualquiera de sus widgets utilizando esta
técnica.
El resaltado en la Figura 3-20 le dice que elColumnael widget no está centrado dentro de
su padreAndamiowidget, y no es lo suficientemente ancho para llenar todo el
Andamioartilugio. Para arreglar esto, ponga elColumnawidget dentro de unCentroartilugio.
Pon el cursor sobre la palabraColumnaen el editor de Android Studio y luego siga las
instrucciones al comienzo de la sección anterior "Hacer que las cosas se vean mejor". Listado
3-7 le muestra lo que obtiene.
Cuando guarda los cambios, Android Studio realiza un reinicio en caliente y verá la
pantalla nueva y mejorada en la Figura 3-21.
FIGURA 3-21:
La columna
widget es
centrado.
¡Esperar! ¿Qué es una “propiedad”? Todo objeto tienepropiedades, y cada propiedad de cada
objeto tiene unvalor. Por ejemplo, cada instancia de FlutterTextola clase tiene un
textScaleFactorpropiedad. En el Listado 3-7, una llamada al constructor establece unTexto
instanciastextScaleFactorpropiedad al valor 2.0.
Las llamadas a constructores no son la única forma de establecer las propiedades de los objetos.
En la Figura 3-22,El panel inferior del Flutter Inspector muestra los valores deColumna
widgetsdirecciónpropiedad, sualineación del eje principalpropiedad, y muchas otras
propiedades. Además, los dosTextolos niños aparecen en el panel inferior de Flutter
Inspector.
FIGURA 3-22:
Propiedades de la
columna (la
Widget de columna
eso esta construido
en el Listado 3-7).
Cuando lo hace, Android Studio muestra una ventana emergente que explica elalineación del eje
principalsignificado de la propiedad. (Consulte la Figura 3-23). El texto de esta ventana
emergente proviene automáticamente de la documentación oficial de Flutter.
una columnaeje principales una línea invisible que va desde la parte superior de la columna hasta su parte
inferior.
FIGURA 3-23:
que es principal
alineación del eje,
¿de todos modos?
La nueva ventana emergente dice que puede reemplazarcomienzocon cualquiera de los valoresfinal,
centro, espacio entre, espacio alrededor,oespacio uniformemente. (Consulte la Figura 3-24.)
FIGURA 3-24:
Los valores que tu
puede asignar a la
ejeprincipal
Alineación
propiedad.
Para ver otra vez la función de enumeración de Dart, consulte la sección "Función de enumeración de
Además, Flutter tiene unVista de la listaartilugio. losVista de la listawidget muestra las cosas
de cualquier manera: de arriba a abajo o de lado a lado. además, elVista de la lista
widget tiene su propia función de desplazamiento. Puedes poner 100 artículos en unVista de la listaa pesar de que
solo caben 20 elementos en la pantalla. Cuando el usuario se desplaza por la pantalla, los elementos se mueven fuera
aplicación Flutter.
2.En la ventana Project Tool de Android Studio, haga clic con el botón derecho en el nombre del proyecto.
sucursal app0308.
5.Compruebe la ventana de la Herramienta de proyecto para asegurarse de que el árbol del proyecto tiene un
nuevoactivosrama. (Consulte la Figura 3-27.)
FIGURA 3-27:
los activos
directorio es un
subdirectorio de
la aplicación0308
directorio.
Si su Explorador de archivos o Finder no muestra las extensiones de nombre de archivo (como .png, .
jpg, .jpeg,o .gifpara archivos de imagen), consulte la barra lateral en el Capítulo 2 que habla sobre esas
molestas extensiones de nombre de archivo.
Es decir, haga clic derecho en el nombre del archivo de imagen. En el menú contextual que aparece,
seleccione Copiar.
Es decir, haga clic derecho en elactivosrama. En el menú contextual resultante, seleccione Pegar.
En el cuadro de diálogo resultante, escriba un nombre para su archivo de imagen y luego
presione Entrar.
9.Abre tu proyectopubspec.yamlexpediente.
Más específicamente, haga doble clic en elpubspec.yamlrama en el árbol de la ventana
Project Tool.
# activos:
# - imágenes/a_dot_burr.jpeg
# - imágenes/a_dot_ham.jpeg
En un .Yamlarchivo, un hashtag (#) le dice a la computadora que ignore todo el resto de la línea.
Entonces, en esta parte del .Yamlarchivo, ninguna de las líneas tiene ningún efecto.
activos:
- MiImagen.png
# - imágenes/a_dot_ham.jpeg
En este punto, quiero dejar una cosa perfectamente clara: no soy narcisista. La razón por la que
utilizo la imagen de la portada de este libro en la figura 3-28 es que me fascina la recursividad.
Me gusta tener una referencia a este libro dentro de este libro.
Flutter tiene unImagenclase, y laImagenLa clase tiene varios constructores diferentes. los
Imagen.activoconstructor en el Listado 3-9 toma un archivo de un lugar dentro del
directorio de su proyecto Flutter. Para obtener una imagen de Internet, llama a un
constructor diferente: elImagen.redconstructor. Para obtener una imagen de algún lugar
de su disco duro (en algún lugar fuera del directorio de su proyecto Flutter), puede llamar
alArchivo de imagenconstructor. Cada uno de estos constructores se llamaconstructor
nombrado. En cada caso, las cosas después del punto (.activo, .red,y .expediente)es ese
constructor en particularnombre.
Has hecho todo eso mientras yo hábilmente desviaba tu atención de varias líneas en el
programa Hello World. ¿Qué hacen las primeras cuatro líneas del programa Hello World?
¿Por qué devuelves algo cuando construyes unMaterialApp?
Las respuestas a estas preguntas, y otras similares, se encuentran en el próximo capítulo. ¿Que
estas esperando? ¡Sigue leyendo!
»Aprendiendo a escribir
Capítulo 4
Hola de nuevo
♪“Hola, hola de nuevo, sh-boom y espero que nos volvamos a encontrar”.♪
— JAMES KEYES, CLAUDE FEASTER, CARL FEASTER, FLOYD F. MCRAE Y
JAMES EDWARDS, CANTO POR LOS ACORDES, LOS CORTES DE EQUIPO,
STAN FREBERG Y OTROS, 1954
resaltar (palabras) {
return "***" + palabras + "***";
}
Puede descargar el código de esta aplicación (y el código para cualquier otra lista en este
libro) de mi sitio web. la URL eshttps://allmycode.com/Flutter.
FIGURA 4-1:
Otro emocionante
Aplicación de aleteo.
El listado 4-2 contiene una declaración de función y una llamada de función. (Consulte la Figura 4-2.)
La declaración de la función
Piense en una receta: un conjunto de instrucciones para preparar una comida en particular.
Una declaración de función es como una receta: es un conjunto de instrucciones para realizar
una tarea en particular. En el Listado 4-2, este conjunto de instrucciones dice: "Forma la cadena
que contiene asteriscos seguida de algunas palabras seguidas de más asteriscos y regresa esa
cadena a alguna parte".
La mayoría de las recetas tienen nombres, como Macaroni and Cheese o Triple Chocolate
Cake. La función al final del Listado 4-2 también tiene un nombre: Su nombre esdestacar.
(Vea la Figura 4-3.) No hay nada especial en el nombredestacar.inventé el nombre
destacartodo por mi cuenta
FIGURA 4-3:
un encabezado
y un cuerpo
Una receta de macarrones con queso se encuentra en un libro o en una página web. La receta
no hace nada. Si nadie usa la receta, la receta permanece inactiva. Lo mismo ocurre con la
declaración de una función. La declaración del Listado 4-2 no hace nada por sí sola. La
declaración simplemente se sienta allí.
Eventualmente, alguien podría decir: “Por favor, haz macarrones con queso para la cena”,
y luego alguien sigue las instrucciones de la receta de macarrones con queso. De una
forma u otra, el proceso comienza cuando alguien dice (o tal vez solo piensa) el nombre
de la receta.
ALlamada de funciónes un código que dice: "Ejecute las instrucciones de una declaración
de función en particular". Imagine un teléfono u otro dispositivo que esté ejecutando el
código del Listado 4-2. Cuando el teléfono encuentra la llamada de funciónresaltar
("Mírame"),el teléfono se desvía de su tarea principal: la tarea de construir una aplicación
con suCentro de materiales,yTextowidgets El teléfono toma un desvío para ejecutar las
instrucciones en eldestacarcuerpo de la función. Después de darse cuenta de que
debería crear "***Mírame ***",el teléfono vuelve a su tarea principal, agregando el
Textowidget con "***Mírame ***"haciaCentrowidget, agregando elCentrowidget para
elMaterialartilugio, y así sucesivamente.
Una llamada de función consta del nombre de una función (como el nombredestacaren
el Listado 4-2), seguido de información de última hora (como "Mírame"
en el Listado 4-2).
La declaración de una función es como una caja negra. Le das algunos valores. La función
hace algo con esos valores para calcular un nuevo valor. Entonces la función devuelve ese
nuevo valor. (Consulte las Figuras 4-4 y 4-5.)
FIGURA 4-4:
Buenas cosas en,
buenas cosas.
FIGURA 4-5:
Adentro lo viejo,
afuera lo nuevo.
• El teléfono reemplaza toda la llamada de función con el valor devuelto para que
efectivamente se convierte
Un libro de cocina puede tener solo una receta de fricasé de pollo, pero puedes seguir la receta
tantas veces como quieras. De la misma manera, una función en particular tiene solo una
declaración, pero una aplicación puede contener muchas llamadas a esa función. Para ver esto
en acción, mire el Listado 4-2 y cambie el códigoniñoparámetro, así:
El nuevo hijo contiene dos llamadas aldestacarfunción, cada uno con su propio valor de
parámetro. La aplicación resultante es la que ve en la Figura 4-6.
SALVANDO EL PLANETA
En el Capítulo 3, le aconsejo que termine cada lista de parámetros con una coma final. Es un buen consejo en la
mayoría de los casos. Pero, para los libros impresos, el número de páginas es muy importante. Para mantener este
casa: Material(
niño: Centro (niño: Texto (resaltar ("Mírame"))),
)
Cuando selecciona Código - Reformatear código, Android Studio formatea su código de acuerdo con las
pautas oficiales de Dart. (Dart usa una herramienta llamadadardofmt.) Cuando Android Studio formatea
el extracto del Listado 4-2, el extracto tiene solo tres líneas. La línea media termina con tres paréntesis
cerrados.
Pero, en lugar de tener tres paréntesis seguidos, puedo separar los paréntesis cercanos con
comas. Cuando hago eso, Android Studio formatea el código de esta manera:
casa: Material(
niño: centro (
niño: Texto(
resaltar ("Mírame"),
),
),
)
La herramienta Dartfmt interpreta una coma como una señal para iniciar una nueva línea de código. Esto duplica el
número de líneas en el extracto del código. ¡Me siento culpable por incluir tantas líneas en esta barra lateral!
Entonces, haz lo que digo, no lo que hago. Recuerde que muchos ejemplos en este libro omiten las comas
finales. Los ejemplos se ejecutan correctamente, pero el estilo del código está fuera de control. Agregue comas
En este capítulo, tengo cuidado de distinguir entre una declaración de función y una llamada de
función. En muchos otros capítulos, me vuelvo descuidado y me refiero a la declaración, al
llamamiento o a ambos como un simple y antiguofunción. No estoy solo en esta práctica. La mayoría
de los programadores hacen lo mismo.
Esta sección presenta algunos hechos poco interesantes sobre el lenguaje de programación Dart.
Intenta no quedarte dormido mientras lo lees.
Declaraciones y declaraciones
Adeclaraciónes un fragmento de código que ordena a Dart que haga algo. Si cree que esta
definición es vaga, está bien por ahora. De todos modos, en el Listado 4-2, la línea
Usa los dardosimpresiónfunciónsolamentepara probar tu código. Eliminar todas las llamadas aimpresión
antes de publicar una aplicación. Si no lo hace, podría enfrentar algunos problemas. En el mejor de los casos, las
llamadas no sirven para nada y pueden ralentizar la ejecución de su aplicación. En el peor de los casos, puede imprimir
¿Qué significa "cinco"? Puedes tener cinco hijos, pero también puedes medir un metro y
medio. Con cinco hijos, sabes exactamente cuántos hijos tienes. (A diferencia de la familia
estadounidense promedio, no puede tener 2,5 hijos). Pero si mide cinco pies de alto, es
posible que realmente mida cinco pies y media pulgada de alto. O podría medir cuatro
pies once y tres cuartos de pulgada y nadie discutiría al respecto.
¿Qué más puede significar “cinco”? Las plantas de energía nuclear pueden someterse a una evaluación de
vulnerabilidad inducida por incendios, también conocida comocinco. En este caso, “cinco” no tiene nada que
ver con un número. Son solo las cinco.
»UnEn tes un número entero, sin dígitos a la derecha del punto decimal.
Si tú escribes
En tcuántos niños = 5;
Si tú escribes
doblealtura = 5;
en un programa Dart, el '5'significa “el carácter que parece una letra mayúsculaSpero
cuya mitad superior tiene vueltas puntiagudas.”
El tipo de un valor determina lo que puede hacer con ese valor. Considere los valores86
y "86".
En algunos idiomas, puede combinar cualquier valor con cualquier otro valor y producir algún
tipo de resultado. No puedes hacer eso en Dart. El lenguaje de programación Dart estipo
seguro.
Dato curioso: en las primeras versiones de FORTRAN (alrededor de 1956), podías cambiar
el significado del literal5para que representara otra cosa, como el número 6. ¡Hablando
de confusión!
el valor de unvariableno es el mismo en todos los programas de Dart. De hecho, el valor de una
variable puede no ser el mismo de una parte de un programa Dart a otra. Tomemos, por
ejemplo, la siguiente línea de código:
cuantosniños = 6;
Unexpresiónes una parte de un programa Dart que representa un valor. Imagine que su código
contiene las siguientes declaraciones de variables:
int numeroDeManzanas = 7;
int numeroDeNaranjas = 10;
Si comienza con estas dos declaraciones, cada entrada en la columna izquierda de la tabla 4-1
es una expresión.
7 7 En t
numerodemanzanas 7 En t
numerodenaranjas 10 En t
8 + numeroDeManzanas 15 En t
(continuado)
El lenguaje Dart tiene declaraciones y expresiones. Adeclaraciónes una orden para hacer
algo; unexpresiónes un código que tiene un valor. Por ejemplo, la declaración
imprimir("Hola");hace algo. (MuestraHolaen la ventana de la herramienta Ejecutar de
Android Studio). La expresión3 + 7 * 21tiene un valor (Su valor es 150.)
Puedes aplicar Dart'sEncadenara cualquier expresión. Para ver algunos ejemplos, consulte el
Capítulo 7.
Dart proporciona una forma rápida de determinar el tipo de una expresión en particular. Para ver
esto, cambie eldestacardeclaración de función en el Listado 4-2 de la siguiente manera:
resaltar (palabras) {
imprimir (20 / 7);
imprimir((20 / 7).runtimeType);
return "***" + palabras + "***";
}
aleteo: 2.857142857142857
aleteo: doble
resaltar (palabras) {
int numeroDeKazoos;
print(numeroDeKazoos);
print(numeroDeKazoos = 94);
return "***" + palabras + "***";
}
Android Studio emite una advertencia de que elnumeroDeKazoosla variable no se usa, pero está
bien. Esto es solo un experimento. Esto es lo que ve en la ventana de la herramienta Ejecutar de
Android Studio cuando ejecuta este código:
aleteo: nulo
aleteo: 94
FIGURA 4-7:
lo mas interno de dart
pensamientos.
Las declaraciones de asignación simples no son las únicas cosas que funcionan como expresiones. Pruebe
este código para el tamaño:
numeroDeKazoos = 100;
print(numeroDeKazoos);
print(numeroDeKazoos++);
print(numeroDeKazoos);
aleteo: 100
aleteo: 100
aleteo: 101
Dart tiene algunas otras declaraciones cuyos valores son expresiones. Por ejemplo, el
siguiente código imprimealeteo: 15dos veces:
Para obtener más información sobre temas como += y *=, visite esta página:
https://dart.dev/guides/language/language-tour#operators
En tx = 7;
imprimir(x);
variableX;
x = 7;
imprimir(x);
Otra razón para usarvariablees evitar nombres de tipo largos y complicados. Para ver un
ejemplo, consulte la sección "Tipos integrados" de este capítulo.
Es posible que haya notado algunas cosas que comienzan con dos barras inclinadas (//) en algunos de
los ejemplos de código del capítulo. Dos barras señalan el comienzo de un comentario.
Acomentarioes parte del texto de un programa. Pero a diferencia de las declaraciones, las llamadas al constructor y
otros elementos similares, el propósito de un comentario es ayudar a las personas a comprender su código. Un
Uncomentario de fin de lineacomienza con dos barras inclinadas y va hasta el final de una línea de tipo.
Entonces, en el siguiente fragmento de código, el texto //Dart está feliz de complaceres un comentario de
final de línea:
Todo el texto en un comentario de final de línea es solo para ojos humanos. El compilador de
Dart no traduce la información de las dos barras al final de la línea.
• Bloquear comentarios
Un comentario de bloque puede abarcar varias líneas. Por ejemplo, el siguiente código es un
comentario de bloque:
Uncomentario de documento al final de la líneacomienza con tres barras (///). Abloquear comentario de
Un comentario de documento está destinado a ser leído por personas que ni siquiera miran el código de
Dart. Pero eso no tiene sentido. ¿Cómo puedes ver un comentario de un documento si nunca miras el
código?
Bueno, cierto programa llamadodardodoc (¿qué más?) puede encontrar cualquier comentario de
documento en un programa y convertir estos comentarios en una página web atractiva. (Por un
ejemplo de una página de este tipo, visitehttps://api.flutter.dev/flutter/widgets/
Widget-class.html.)
profesionales de Dart favorecen los comentarios de documentos al final de la línea sobre los comentarios de documentos en bloque.
Se burlan de los comentarios de documentos de bloque y de los comentarios de documentos de bloque. No ponen ningún stock en
los comentarios de documentos de bloque. No asimilan los comentarios de documentos de bloque. En su opinión, un comentario de
documento al final de la línea es excelente, pero la idea de un comentario de documento en bloque es una tontería.
Una idea más sobre los comentarios en general: en el Capítulo 3, describo una forma de mostrar las
etiquetas de cierre en el editor de Android Studio.
casa: Material(
niño: Texto("¡Hola mundo!"),
) , //Material
Tipos incorporados
En un programa Dart, cada valor tiene unescribe.Dart tiene diez tipos integrados. (Consulte la
Tabla 4-2.)
Escribe un nombre Cómo se ven los literales Información útil sobre el tipo
Tipos de números
doble 42,0 42,1 Números con dígitos a la derecha del punto decimal
(posiblemente, todos cero dígitos).
(continuado)
Escribe un nombre Cómo se ven los literales Información útil sobre el tipo
Tipos de colección
Lista [2, 4, –9, 25, 18] Un montón de valores. El valor inicial es el 0, el siguiente
valor es el 1, el siguiente valor es el 2 y así sucesivamente.
["Hola", "Adiós", 86] (Con [], el grupo no tiene valores).
[]
<int>[]
Establecer {2, 4, –9, 25, 18} Un montón de valores sin duplicados en ningún orden en
particular. (Con {}, el grupo no tiene valores).
{"Hola", "Adiós", 86}
{}
<int>{}
Otros tipos
""
"""El anterior
bool verdadero Falso Un valor lógico. Una variable de este tipo tiene uno de los dos
únicos valores posibles:verdaderoyfalso.
runas Runas('Yo ' '\u2665' 'tú') Una cadena de caracteres Unicode. Por ejemplo, '\u2665'
es un personaje de corazón (♥).
Puede combinar tipos para crear nuevos tipos. Una forma de hacer esto es poner tipos
dentro de tipos de colección. Por ejemplo, en la siguiente declaración, las cantidades
variables son unListaque contiene soloEn tvalores.
En casos como ese, su mejor apuesta es usar elvariablepalabra clave. Por lo general, Dart
puede resolver las cosas mirando el resto del código.
variablevalores = {
"Tamaño": {
Como muchas otras declaraciones de variables, esta línea tiene un nombre de tipo (Aplicación0401),
seguido de un nuevo nombre de variable (mi aplicación),seguido de una inicialización. La
inicialización hacemiAplicaciónreferirse a una nueva construcciónaplicación0401instancia.
El lenguaje Dart viene con una biblioteca llena de código estándar reutilizable. El nombre
formal de tal biblioteca es unInterfaz de programación de aplicaciones(API). La API de Dart
tiene declaraciones de muchas clases. Por ejemplo, instancias de DartFecha y horaclase son
momentos en el tiempo, y las instancias de laDuraciónclase son intervalos de tiempo.
Del mismo modo, el kit de herramientas Flutter viene con una API rica en funciones. En el Listado 4-1,widget,
¡Ay de mí! no puedo leer el libroAleteo para tontosa menos que vaya a mi biblioteca local
y saque una copia. Lo mismo ocurre con las clases de biblioteca de Dart y Flutter.
Si eliminas esta línea, ni siquiera podrás usar ninguna de las funciones de Flutter.Widgetclases
(Sin estadoWidget, Widget, Centro,yTexto,para nombrar unos pocos). Eso es porque, cuando
importas 'paquete:flutter/material.dart',usted importa automáticamente
'paquete: aleteo/widgets.dart'además.
Un número relativamente pequeño de clases de API de Dart, como la mencionada anteriormenteFecha y hora
importar 'dardo:núcleo';
Nadie (y quiero decirnadie) memoriza los nombres de todas las clases en las bibliotecas
Dart o Flutter. Cuando necesite saber acerca de una clase, búsquela visitando
https://api.flutter.dev.
principal() {
ejecutarAplicación(Aplicación0403());
BRILLA TU CUERDA
El listado 4-2 contiene el siguiente código:
La yuxtaposición de signos más y comillas puede dificultar la lectura del código. Para facilitarle la
vida, Dart tiene interpolación de cadenas. Coninterpolación de cadenas, un signo de dólar ps
significa, "Ignore temporalmente las comillas que lo rodean y encuentre el valor de la siguiente
variable". Por eso, en el Listado 4-3, la expresión "*** $palabras ***"
representa "***Mírame ***" -la misma cadena que obtiene en el Listado 4-2.
// La llamada a la función
obtenerInstrucciones1(8, "+", ";", "'")
// La declaración de la función
obtenerInstrucciones1(cuantos, char1, char2, char3) {
devolver "Contraseña:" +
cuantos.toString() +
" caracteres; No use " + char1 +
""+
char2 +
"o" +
char3;
}
(continuado)
Cada vez que intento escribir código de este tipo, olvido incluir algunos espacios en blanco, comillas u
otros elementos. Así es como obtiene el mismo valor de retorno usando la interpolación de cadenas:
// La llamada a la función
Texto(obtenerInstrucciones2(8, "+", ";", "'")
// La declaración de la función
obtenerInstrucciones2(cuantos, char1, char2, char3) {
return "Contraseña: $cuantos caracteres; No use $char1 $char2 o $char3";
}
Cuando utiliza la interpolación de cadenas, puede ir un paso más allá. Esto es lo que puede
hacer cuando agrega llaves a la mezcla:
// La llamada a la función
obtenerInstrucciones3(8, "+", ";", "'")
// La declaración de la función
obtenerInstrucciones3(cuantos, char1, char2, char3) {
devolver "Contraseña:pscuantos + 1}caracteres; No use $char1 $char2 o
$char3";
}
Para leer todo sobre el signo de dólar ($) en la última línea del Listado 4-3, consulte la barra lateral
cercana "Bling your string".
Una ejecución del código del Listado 4-3 es la misma que la del Listado 4-2. (Consulte la Figura
4-1.) En cierto sentido, el Listado 4-3 contiene el mismo programa que el Listado 4-2. La
notación de las cosas es ligeramente diferente, pero las cosas mismas son las mismas.
Volviendo al Listado 4-2, utilizo la notación de flecha gruesa para declarar elprincipalfunción. Solo para
demostrar que puedo hacerlo, desactivo la flecha de esta declaración en el Listado 4-3.
ejecutarAplicación(Aplicación0403());
le dice a Dart que construya una instancia deaplicación0403y luego ejecute esa instancia. los
ejecutar la aplicaciónLa función es parte de la API de Flutter.
Cuerdadestacar(Cuerdapalabras) {
return "*** $palabras ***";
}
resaltar(19)
Cerca del final del Listado 4-4,Resaltado de cadenale dice a Dart que el valor devuelto por
eldestacarla función debe ser unaCuerda.Si accidentalmente escribe el siguiente código,
Dart se quejará como si no fuera asunto de nadie:
Continuando nuestro viaje a través del Listado 4-4,vacío principalno significa del todo, "La
principalla función debe devolver un valor de tipovacío."¿Por que no? Está bien poner un nombre de tipo
delante de una declaración de flecha ancha. Entonces, ¿qué tiene de diferente¿vacío principal?
vacíoprincipal() {
ejecutarAplicación(Aplicación0404());
devolver 0; // Malo
}
Si hace esto, el editor de Android Studio agrega marcas rojas a su código. Dart está diciendo: “Lo
siento, Bud. No puedes hacer eso.
Incluso puede tener una función con parámetros posicionales y con nombre. En la lista de
parámetros, todos los parámetros posicionales deben aparecer antes que cualquiera de los
parámetros nombrados. Por ejemplo, el siguiente código muestra +++¡Mírame! +++.
"Mírame",
puntuación: "!",
símbolos: "+++",
)
puntuación de cadena,
símbolos de cadena,
}) {
volver símbolos + palabras + puntuación + símbolos;
}
devolver MaterialApp(
Una función que pertenece a una clase, oa las instancias de la clase, tiene un nombre especial.
se llama unmétodo. Más sobre esto en el Capítulo 5.
Capítulo5
Hacer que las cosas sucedan
T
l día es el 20 de octubre de 1952. En Kenia, el gobernador colonial británico declara
el estado de emergencia. En Filadelfia nace la actriz Melanie Mayron (nieta de
Frances Goodman). En los EE. UU., una entrega de "I Love Lucy" se convierte en el
primer episodio de televisión que se transmite más de una vez.
¿Qué? "Me encanta Lucy"? Sí, "Amo a Lucy". Hasta ese día no existían las reposiciones televisivas
(también conocidas como “repeticiones”). Todo en la televisión era nuevo.
Por supuesto, promocionar cosas como "nuevas", "lo mejor" o "lo último" puede resultar
contraproducente. De hecho, la exageración de cualquier tipo puede resultar contraproducente.
Considere el caso de la crema de afeitar Swell de Stanley. En 1954, Stanley's era el líder del mercado.
Un año más tarde, cuando las ventas se estaban desacelerando, los anunciantes la rebautizaron como
Stanley's Neat New Shaving Cream. Al año siguiente, se convirtió en la Crema de Afeitar Superior de
Stanley. Las ventas del producto estuvieron bien durante los siguientes años. Pero a principios de la
década de 1960, las ventas se desplomaron y los anunciantes de Stanley estaban en un aprieto. ¿Qué
podría ser mejor que la "Crema de afeitar superior"? ¿Mejor que la mejor crema de afeitar? Después
de varias reuniones largas, un genio en el departamento de marketing ideó la crema de afeitar
Sensational Shocking Pink de Stanley, una mezcla de colores brillantes de jabón, glicerina, emolientes,
tinte rojo número 2 y probablemente algún pegamento de secado lento.
Puede preguntar: "¿Qué demonios tiene que ver la crema de afeitar Stanley's con el desarrollo de
aplicaciones Flutter?" Mi punto es que existe el peligro de exagerar un producto, y exagerar un
concepto de desarrollo de aplicaciones no es mejor. En los Capítulos 3 y 4, uso términos elogiosos
para describir las estrategias de programación de Flutter, con sus constructores, funciones y otras
cosas buenas. Pero aquí, en el Capítulo 5, arrojé dudas sobre esos ejemplos introductorios porque
ninguno de ellos permite al usuario cambiar nada en la pantalla. Una aplicación que siempre muestra
el mismo texto anterior es aburrida y los usuarios calificarán la aplicación con cero estrellas. Una
aplicación interesante interactúa con el usuario. La pantalla de la aplicación cambia cuando el usuario
ingresa texto, toca un botón, mueve un control deslizante o hace algo más para obtener una
respuesta útil de la aplicación. Hacer que las cosas sucedan es esencial para cualquier tipo de
desarrollo de aplicaciones móviles. Entonces, en este capítulo, comienzas a aprender cómo hacer que
las cosas sucedan.
Cuando creas un nuevo proyecto de Flutter, Android Studio hace undardo principalarchivo para usted. los
dardo principalEl archivo contiene una linda y pequeña aplicación de inicio. El Listado 5-1 tiene una versión
reducida de esa aplicación de inicio.
void _cambiarTexto() {
setState(_getNewText);
}
void _getNewText() {
_pressedOrNot = "Ha presionado el botón.";
}
El código del Listado 5-1 captura la esencia de la aplicación de inicio en la versión de octubre de
2019 de Android Studio. Para cuando lea este libro, es posible que los creadores de Flutter
hayan cambiado por completo la aplicación de inicio. Si las cosas del Listado 5-1 se parecen
poco a la aplicación de inicio que recibe cuando crea un nuevo proyecto, no se preocupe. Sólo
haz lo que has estado haciendo. Es decir, elimine todos los de Android Studiodardo principal
y reemplácelo con el código del Listado 5-1.
FIGURA 5-1:
Antes de presionar
el botón.
FIGURA 5-2:
Después de presionar
el botón.
¡Al final! ¡Una aplicación Flutter está haciendo que algo suceda!
Para comprender lo que sucede, debe conocer dos tipos de widgets. Para aprender sus
nombres, lea el título de la siguiente sección.
Este consejo no tiene nada que ver con Flutter. Si te encuentras con alguien de otro país,
pregúntale el color de la bombilla del medio en un semáforo. Durante una breve conversación
con cinco personas, obtuve amarillo, ámbar, dorado y naranja. Vea cuántos nombres de colores
diferentes puede recolectar.
La aplicación del Listado 5-1 tiene una página de inicio (llamadaMi página de inicio),y esa página de
inicio está en uno de dos estados. Un estado se muestra en la Figura 5-1. Es el estado en el que el
Textowidget muestra "No ha presionado el botón". El otro estado se muestra en la Figura
5-2. Es el estado en el que elTextoel widget muestra "Has presionado el botón".
Piense de nuevo en un semáforo. La parte con las bombillas se apoya en un poste que se
sujeta de forma permanente al suelo. Todo el conjunto (poste, bombillas y todo) no
cambia. Pero las corrientes que pasan por las bombillas cambian cada 30 segundos más
o menos. Ahí tienes. Todo el ensamblaje no cambia y no tiene estado, pero una parte de
ese ensamblaje, la parte responsable de mostrar los colores, cambia y tiene estado.
(Consulte la Figura 5-3.)
FIGURA 5-3:
Un acertijo: ¿Cómo es un
programa de aleteo
como un semáforo?
Un widget sin estadoconstruirEl método le dice a Flutter cómo construir el widget. Entre otras
cosas, el método describe el aspecto y el comportamiento del widget. Cada vez que inicia el
programa en el Listado 5-1, Flutter llama alaplicación0501de claseconstruirmétodo.
¿Con qué frecuencia su ciudad construye un nuevo conjunto de semáforos? Donde vivo, puedo
ver uno subiendo cada dos años más o menos. La parte metálica de un semáforo no está
diseñada para cambiar regularmente. Los urbanistas convocan a la asamblea del semáforo
construirmétodo sólo cuando construyen una nueva luz. Lo mismo ocurre con los widgets sin
estado en Flutter. Un widget sin estado no está diseñado para cambiarse. Cuando un widget sin
estado requiere cambios, Flutter reemplaza el widget.
¿Qué pasa con los widgets con estado? Tienen ellosconstruir¿métodos? Bueno, lo hacen y no lo
hacen. Cada widget con estado debe tener uncrear estadométodo. loscrear estado
método crea una instancia de FlutterEstadoclase, y cadaEstadola clase tiene lo suyoconstruir
método. En otras palabras, un widget con estado no se crea solo. En cambio, un widget con
estado crea un estado y el estado se crea a sí mismo. (Consulte la Figura 5-4.)
FIGURA 5-4:
Widgets con estado
no fueron construidos
en un día.
Cada clase que se extiendeWidget sin estadodebe tener unconstruirmétodo. La API de Flutter hace
cumplir esa regla.
Cuando lo haga, verá algunas marcas rojas en el editor de Android Studio. Las marcas rojas
indican que el programa contiene un error; a saber, queaplicación0501no tiene propio
construirmétodo.
Para comentar rápidamente varias líneas de código, arrastre el mouse para que el resaltado toque
cada una de esas líneas. Luego, si está usando Windows, presione Ctrl-/. Si está usando una Mac,
presione Cmd-/.
¿Cómo aplica Dart suconstruirrequisito de método? Como desarrollador novato, no es necesario que sepa
la respuesta. Puede omitir el resto de esta barra lateral y seguir felizmente su camino. Pero si tienes
curiosidad y no te importa tomar un pequeño desvío en tu aprendizaje, prueba esto:
En el editor de Android Studio, haga clic derecho en la palabraWidget sin estado.En el menú
contextual resultante, seleccione Ir a - Declaración.Et voila!Una nueva pestaña que contiene la
Widget sin estadodeclaración de clase se abre en el editor. Si ignora la mayor parte
del código en elWidget sin estadodeclaración de clase, verá algo como esto:
(continuado)
la primera palabra,resumen,advierte a Dart que esta declaración de clase contiene métodos (es
decir, funciones) sin cuerpos. Y, de hecho, la línea
es un encabezado de método sin cuerpo. En lugar de un cuerpo, solo hay un punto y coma.
• Si extiende una clase abstracta, debe proporcionar una declaración completa para cada uno de
los métodos abstractos de la clase.
devolver MaterialApp(
inicio: MiPáginaInicio(),
);
}
porque, cerca de la parte superior del Listado 5-1, hay una línea que contiene unaplicación0501()llamada
del constructor.
El estado de un semáforo típico cambia cada 30 segundos o cada pocos minutos y, por lo tanto,
se reconstruye el estado de la luz. De la misma manera, elconstruirEl método que pertenece
(indirectamente) a un widget con estado se llama una y otra vez durante la ejecución de un
programa. Para eso están los widgets con estado. Son cosas ágiles cuya apariencia puede
cambiar fácilmente. Por el contrario, un widget sin estado es como el poste de un semáforo. Es
una estructura rígida pensada para un solo uso.
El listado 5-1 tiene declaraciones para funciones nombradasprincipal, compilar, crear estado,
_getNewText,y _cambiar el texto,pero el código del Listado 5-1 no llama a ninguna de estas
funciones. En cambio, el código de marco de Flutter llama a estas funciones cuando un dispositivo
ejecuta la aplicación.
»El lenguaje Dart llama alprincipalfuncionan cuando el código del Listado 5-1
empieza a correr
losprincipalfunción construye una instancia deaplicación0501y llamadasejecutar la aplicaciónpara hacer que las
niño: Texto(
_presionado o no,
),
void _cambiarTexto() {
setState(_getNewText);
}
void _getNewText() {
_pressedOrNot = "Ha presionado el botón.";
}
losonPressedEl parámetro le dice a Flutter "Si y cuando el usuario presiona el botón, haga que
el dispositivo llame al _cambiarTextofunción." De hecho, suceden muchas cosas cuando el
usuario presiona el botón de acción flotante. En las próximas secciones, verá algunos de los
detalles.
el gran evento
En la programación GUI, uneventoes algo que sucede, algo que puede requerir una respuesta
de algún tipo. La pulsación de un botón es un ejemplo de un evento. Otros ejemplos de eventos
incluyen una llamada telefónica entrante, el movimiento de un dispositivo a una nueva
ubicación de GPS o el hecho de que una aplicación necesita información de otra aplicación.
Uncontrolador de eventoses una función que se llama cuando ocurre un evento. En el Listado
5-1, el _cambiarTextofunción es un controlador para el botónonPressedevento. En sí mismo,
el códigoonPressed: _changeTextno llama al _cambiarTextofunción. En cambio, ese código
registra la función_cambiarTextocomo controlador oficial de pulsaciones de botones de acción
flotante.
Llámame
Un teléfono suena cuatro veces. Nadie responde, pero escucho un anuncio grabado.
“Este es Steve Hayes, editor ejecutivo de John Wiley and Sons. Siento no estar aquí para
atender tu llamada. Deje un mensaje y me pondré en contacto con usted tan pronto como
pueda”.<pitido>
"Hola Steve. Este es Barry. losAleteo para tontosEl manuscrito va muy bien, pero va a
tardar varios meses. Por favor llámeme para que podamos discutir un nuevo horario.
No me llames a mi número de teléfono habitual. En cambio, llámame a mi hotel en
Taha'a, Polinesia Francesa. El número es +689 49 55 55 55. ¡Adiós!”
Mi número de teléfono en Taha'a es un número de devolución de llamada. De la misma manera, las funciones
onPressed: _changeText
setState(_getNewText)
Es posible que haya escrito programas que no tienen devoluciones de llamada. Cuando su
programa comienza a ejecutarse, el sistema ejecuta la primera línea de código y sigue
ejecutando instrucciones hasta que llega a la última línea de código. Todo funciona según lo
planeado de principio a fin. (Bueno, en el mejor de los casos, todo sale según lo planeado).
Una devolución de llamada agrega un elemento de incertidumbre a un programa. ¿Cuándo tendrá lugar un
evento? ¿Cuándo se llamará a una función? ¿Dónde está el código que llama a la función? Los programas con
devoluciones de llamada son más difíciles de entender que los programas sin devoluciones de llamada.
¿Por qué necesita devoluciones de llamada? ¿Puedes escaparte sin tenerlos? Para ayudar a
responder a esta pregunta, piense en su despertador común y cotidiano. Antes de irte a dormir,
le dices al despertador que envíe un sonido a tus oídos (una devolución de llamada) cuando las
9SOYsucede el evento:
FIGURA 5-5:
Qué buscar
en el Listado 5-1.
De acuerdo con la Figura 5-5, esta es la estrategia de gestión estatal del Listado 5-1:
1.Registro _cambiarTextocomo una función de devolución de llamada y espere a que el usuario presione el
botón de acción flotante.