Diferencia entre revisiones de «Flutter Widget Diseño de pantallas»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 27: Línea 27:
 
* <u>No poseen Scroll</u> y por lo tanto los Widgets que lo conforman no deberían ocupar más espacio que el espacio del contenedor donde se encuentren.
 
* <u>No poseen Scroll</u> y por lo tanto los Widgets que lo conforman no deberían ocupar más espacio que el espacio del contenedor donde se encuentren.
 
: En caso de necesitar un scroll tendríamos que hacer uso de [https://wiki.cifprodolfoucha.es/index.php?title=Flutter_Widget_Componentes#ListView un Widget ListView] como ya vimos en la sección anterior.
 
: En caso de necesitar un scroll tendríamos que hacer uso de [https://wiki.cifprodolfoucha.es/index.php?title=Flutter_Widget_Componentes#ListView un Widget ListView] como ya vimos en la sección anterior.
 +
 +
 +
 +
* Creamos una nueva página en la [https://wiki.cifprodolfoucha.es/index.php?title=Flutter_Widget#Estructura_de_p.C3.A1ginas carpeta pages] de nombre '''columnrow_page.dart'''
 +
: En todas las páginas haremos lo mismo:
 +
:* Importamos la librería de 'material' (recordar que existe un [https://github.com/marius-h/flutter_enhancement_suite/blob/main/SNIPPETS.md#flutter-widget-snippets snippet] que lo hace automático).
 +
:* Creamos una clase (ColumnRowPage) que derive de StatelessWidget (al hacerlo será necesario implementar el método build, ya os da un aviso el Android Studio).
 +
 +
 +
 +
* Los parámetros más usados son:
 +
:* children[]: Conjunto de Widget que van a aparecer visualmente.
 +
:* [https://api.flutter.dev/flutter/rendering/MainAxisAlignment-class.html MainAxisAlignment]: Indicamos como van a posicionarse los children con respecto al eje principal.
 +
::* En el caso de Column, el eje principal es el vertical y en el caso de Row, es el eje horizontal.
 +
:* [https://api.flutter.dev/flutter/rendering/CrossAxisAlignment-class.html CrossAxisAlignmen]: Indicamos como van a posicionarse los children con respecto al eje perpendicular al principal.
 +
::* En el caso de Column, el eje Cross es el horizontal y en el caso de Row, es el eje vertical.
 +
 +
 +
* Veamos una imagen en la que va a quedar más claro a que se refiere cada eje en cada caso:
 +
[[Imagen:Flutter_dart_colrow_3.JPG|500px|center]]
 +
 +
 +
 +
<br />
 +
* Veamos un ejemplo sencillo en el que emplearemos un Column para colocar texto visualmente en forma de filas (recordar que Column coloca a los widget en una línea vertical).
 +
: Dejamos los valores por defecto para cada eje y veremos que los elementos empiezan a colocarse en la parte superior (MainAxisAlignment.start) y horizontalmente están centrados con respecto al espacio que ocupan (CrossAxisAlignment.center), cogiendo como referencia la fila que ocupa más ancho)
 +
 +
[[Imagen:Flutter_dart_colrow_2.JPG|300px|center]]
 +
 +
 +
 +
:<syntaxhighlight lang="java" enclose="div" highlight="11-18">
 +
import 'package:flutter/material.dart';
 +
 +
class ColumnRowPage extends StatelessWidget {
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
    return Scaffold(
 +
        appBar: AppBar(
 +
          title: Text('Ejemplo de uso de Row y Colum'),
 +
        ),
 +
        body: Column(
 +
          children: [
 +
            Text('Texto de la primera fila',style: TextStyle(backgroundColor: Colors.yellow),),
 +
            Text('Texto de la segunda fila. Este texto es más largo.',style: TextStyle(backgroundColor: Colors.red),),
 +
            Text('Texto de la tercera fila',style: TextStyle(backgroundColor: Colors.brown),),
 +
 +
          ],
 +
        )
 +
    );
 +
  }
 +
}
 +
 +
</syntaxhighlight>
 +
 +
 +
* Ahora veamos un ejemplo modificando alguno de los parámetros de los ejes:
 +
[[Imagen:Flutter_dart_colrow_4.JPG|300px|center]]
 +
 +
 +
 +
:<syntaxhighlight lang="java" enclose="div" highlight="12-13">
 +
import 'package:flutter/material.dart';
 +
 +
class ColumnRowPage extends StatelessWidget {
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
    return Scaffold(
 +
        appBar: AppBar(
 +
          title: Text('Ejemplo de uso de Row y Colum'),
 +
        ),
 +
        body: Column(
 +
          mainAxisAlignment: MainAxisAlignment.center,
 +
          crossAxisAlignment: CrossAxisAlignment.end,
 +
          children: [
 +
            Text('Texto de la primera fila',style: TextStyle(backgroundColor: Colors.yellow),),
 +
            Text('Texto de la segunda fila. Este texto es más largo.',style: TextStyle(backgroundColor: Colors.red),),
 +
            Text('Texto de la tercera fila',style: TextStyle(backgroundColor: Colors.brown),),
 +
 +
          ],
 +
        )
 +
    );
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
 +
 +
* Como en Html, estos widgets son 'contenedores' y podemos tener como parte de un children otro contenedor, por lo tanto podemos tener dentro de Row y Column, otros Row y Column de forma anidada...
 +
: Veamos un ejemplo.
 +
: Fijarse que por defecto, tanto Row como Column toman como 'referecia' el widget que ocupa más espacio.
 +
: En el siguiente ejemplo, el Widget Row está alineado en el CrossAxis al final (CrossAxisAlignment.end) y como uno de los iconos es más alto, el resto se sitúa en la parte baja del mismo.
 +
 +
 +
[[Imagen:Flutter_dart_colrow_5.JPG|300px|center]]
 +
 +
:<syntaxhighlight lang="java" enclose="div" highlight="16-24">
 +
import 'package:flutter/material.dart';
 +
 +
class ColumnRowPage extends StatelessWidget {
 +
 +
  @override
 +
  Widget build(BuildContext context) {
 +
    return Scaffold(
 +
        appBar: AppBar(
 +
          title: Text('Ejemplo de uso de Row y Colum'),
 +
        ),
 +
        body: Column(
 +
          mainAxisAlignment: MainAxisAlignment.center,
 +
          crossAxisAlignment: CrossAxisAlignment.center,
 +
          children: [
 +
            Text('Texto de la primera fila',style: TextStyle(backgroundColor: Colors.yellow),),
 +
            Row(
 +
              mainAxisAlignment: MainAxisAlignment.start,
 +
              crossAxisAlignment: CrossAxisAlignment.end,
 +
              children: [
 +
                Icon(Icons.favorite, size: 50,),
 +
                Icon(Icons.audiotrack, size: 100,),
 +
                Icon(Icons.cast, size:50,),
 +
              ],
 +
            ),
 +
            Text('Texto de la tercera fila',style: TextStyle(backgroundColor: Colors.brown),),
 +
 +
          ],
 +
        )
 +
    );
 +
  }
 +
}
 +
 +
</syntaxhighlight>
  
  
Línea 33: Línea 165:
  
 
* Asociado al widget Row y Column se suele utilizar el [https://api.flutter.dev/flutter/widgets/Expanded-class.html widget Expand], que permite 'expandir' el tamaño del widget hasta el tamaño de su contenedor.
 
* Asociado al widget Row y Column se suele utilizar el [https://api.flutter.dev/flutter/widgets/Expanded-class.html widget Expand], que permite 'expandir' el tamaño del widget hasta el tamaño de su contenedor.
 +
 +
 +
[[Imagen:Flutter_dart_colrow_4.JPG|300px|center]]
 +
:<syntaxhighlight lang="java" enclose="div" highlight="">
 +
 +
</syntaxhighlight>
 +
 
   
 
   
  

Revisión del 11:34 13 ago 2021

Introducción

  • En las secciones anteriores vimos algunos de los widgets que podemos emplear para visualizar contenidos en una pantalla.
En esta sección vamos a ver widgets que nos permiten colocar a otros widgets en ciertas posiciones en base a las propiedades que disponga el Widget.
Vienen a ser el equivalente a divs en HTML.


  • Asociado a este punto vamos a ver como identificar y solucionar los problemas que podamos tener de posicionamiento cuando los widgets no queppan en el espacio asignado por su widget contenedor.



Column / Row

  • Más información en:
  • Estos widgets permiten 'colocar' en forma de fila o columna el cojunto de Widget que se encuentran dentro.
  • El widget Column coloca los widgets uno debajo del otro (en una línea vertical)
  • El widgert Row coloca los widgets uno al lado del otro (en una línea horizontal).
Flutter dart colrow 1.JPG
Imagen obtenida de este sito web


  • No poseen Scroll y por lo tanto los Widgets que lo conforman no deberían ocupar más espacio que el espacio del contenedor donde se encuentren.
En caso de necesitar un scroll tendríamos que hacer uso de un Widget ListView como ya vimos en la sección anterior.


  • Creamos una nueva página en la carpeta pages de nombre columnrow_page.dart
En todas las páginas haremos lo mismo:
  • Importamos la librería de 'material' (recordar que existe un snippet que lo hace automático).
  • Creamos una clase (ColumnRowPage) que derive de StatelessWidget (al hacerlo será necesario implementar el método build, ya os da un aviso el Android Studio).


  • Los parámetros más usados son:
  • children[]: Conjunto de Widget que van a aparecer visualmente.
  • MainAxisAlignment: Indicamos como van a posicionarse los children con respecto al eje principal.
  • En el caso de Column, el eje principal es el vertical y en el caso de Row, es el eje horizontal.
  • CrossAxisAlignmen: Indicamos como van a posicionarse los children con respecto al eje perpendicular al principal.
  • En el caso de Column, el eje Cross es el horizontal y en el caso de Row, es el eje vertical.


  • Veamos una imagen en la que va a quedar más claro a que se refiere cada eje en cada caso:
Flutter dart colrow 3.JPG



  • Veamos un ejemplo sencillo en el que emplearemos un Column para colocar texto visualmente en forma de filas (recordar que Column coloca a los widget en una línea vertical).
Dejamos los valores por defecto para cada eje y veremos que los elementos empiezan a colocarse en la parte superior (MainAxisAlignment.start) y horizontalmente están centrados con respecto al espacio que ocupan (CrossAxisAlignment.center), cogiendo como referencia la fila que ocupa más ancho)
Flutter dart colrow 2.JPG


import 'package:flutter/material.dart';

class ColumnRowPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Ejemplo de uso de Row y Colum'),
        ),
        body: Column(
          children: [
            Text('Texto de la primera fila',style: TextStyle(backgroundColor: Colors.yellow),),
            Text('Texto de la segunda fila. Este texto es más largo.',style: TextStyle(backgroundColor: Colors.red),),
            Text('Texto de la tercera fila',style: TextStyle(backgroundColor: Colors.brown),),

          ],
        )
    );
  }
}


  • Ahora veamos un ejemplo modificando alguno de los parámetros de los ejes:
Flutter dart colrow 4.JPG


import 'package:flutter/material.dart';

class ColumnRowPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Ejemplo de uso de Row y Colum'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.end,
          children: [
            Text('Texto de la primera fila',style: TextStyle(backgroundColor: Colors.yellow),),
            Text('Texto de la segunda fila. Este texto es más largo.',style: TextStyle(backgroundColor: Colors.red),),
            Text('Texto de la tercera fila',style: TextStyle(backgroundColor: Colors.brown),),

          ],
        )
    );
  }
}


  • Como en Html, estos widgets son 'contenedores' y podemos tener como parte de un children otro contenedor, por lo tanto podemos tener dentro de Row y Column, otros Row y Column de forma anidada...
Veamos un ejemplo.
Fijarse que por defecto, tanto Row como Column toman como 'referecia' el widget que ocupa más espacio.
En el siguiente ejemplo, el Widget Row está alineado en el CrossAxis al final (CrossAxisAlignment.end) y como uno de los iconos es más alto, el resto se sitúa en la parte baja del mismo.


Flutter dart colrow 5.JPG
import 'package:flutter/material.dart';

class ColumnRowPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Ejemplo de uso de Row y Colum'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('Texto de la primera fila',style: TextStyle(backgroundColor: Colors.yellow),),
            Row(
              mainAxisAlignment: MainAxisAlignment.start,
              crossAxisAlignment: CrossAxisAlignment.end,
              children: [
                Icon(Icons.favorite, size: 50,),
                Icon(Icons.audiotrack, size: 100,),
                Icon(Icons.cast, size:50,),
              ],
            ),
            Text('Texto de la tercera fila',style: TextStyle(backgroundColor: Colors.brown),),

          ],
        )
    );
  }
}



Expand

  • Asociado al widget Row y Column se suele utilizar el widget Expand, que permite 'expandir' el tamaño del widget hasta el tamaño de su contenedor.


Flutter dart colrow 4.JPG




Align / Center

  • Normalmente son usados cuando queramos centrar o alinear un único widget.

Container


SizeBox

Debugger Diseño

  • Debugger de diseño. Verificar el tamaño de las cajas de cada widget y localizar cual de ellas produce un error




Enlaces de interés


  • En el Card Widget vimos que disponemos del parámetro clipBehavior para 'recortar' el contenido y que se ajuste a los bordes redondeados.
Si queremos hacer lo mismo con cualquier Widget podemos hacer uso del https://api.flutter.dev/flutter/widgets/ClipRRect-class.html






Enlace a la página principal de la UD3

Enlace a la página principal del curso




-- Ángel D. Fernández González -- (2021).