Diferencia entre revisiones de «Flutter StatefulWidget. Eventos»
Ir a la navegación
Ir a la búsqueda
(Página creada con «Sobre container => https://stackoverflow.com/questions/44317188/flutter-ontap-method-for-containers») |
|||
| Línea 1: | Línea 1: | ||
| + | ==Introducción== | ||
| + | |||
| + | * Ya vimos en la [https://wiki.cifprodolfoucha.es/index.php?title=Flutter_StatefulWidget._Formularios sección anterior de formularios] como gestionar los diferentes eventos que se puedan producir en los elementos gráficos que conforman un formulario. | ||
| + | |||
| + | * Pero puede ser necesario que queramos gestionar algún evento sobre un Widget el cual no tenga asociado ninguna función de gestión de eventos sobre el mismo en su constructor. | ||
| + | : Veremos en este punto, cómo podemos implementar estos eventos. | ||
| + | |||
| + | |||
| + | |||
| + | * 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 '''eventos_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 (EventosPage) que derive de '''StatefulWidget'''. Se creará (si lo hacéis con un Snippet) una clase asociada que deriva de State. | ||
| + | :* Modificamos la clase State y en su métod build hacemos que devuelva un Scaffold con una Appbar (hacerlo con un Snippet) | ||
| + | |||
| + | |||
| + | <br /> | ||
| + | ==InkWell== | ||
| + | |||
| + | * Más información en: https://api.flutter.dev/flutter/material/InkWell-class.html | ||
| + | |||
| + | : <u>Nota:</u> Para emplear este Widget es necesario que exista un Material Widget en alguno de sus ancestros en la jerarquía de Widget. | ||
| + | |||
| + | * Podéis consultar que eventos se pueden gestionar con este Widget [https://api.flutter.dev/flutter/material/InkWell-class.html#instance-properties en las propiedades del mismo que comienzan con onPPPPPPP]. | ||
| + | |||
| + | : En el siguiente ejemplo vamos a ver las que normalmente vais necesitar emplear, con el click (onTap) o doble click (onDoubleTap), mantener presionado (onLongPress). | ||
| + | |||
| + | |||
| + | [[Imagen:Flutter_dart_eventos_1.JPG|300px|center]] | ||
| + | |||
| + | |||
| + | :<syntaxhighlight lang="java" enclose="div" highlight="34,36,42,44,50,52" > | ||
| + | import 'package:flutter/material.dart'; | ||
| + | |||
| + | class EventosPage extends StatefulWidget { | ||
| + | const EventosPage({Key? key}) : super(key: key); | ||
| + | |||
| + | @override | ||
| + | _EventosPageState createState() => _EventosPageState(); | ||
| + | } | ||
| + | |||
| + | class _EventosPageState extends State<EventosPage> { | ||
| + | String _textoClick='Evento CLICK'; | ||
| + | String _textoDoubleClick = 'EVENTO DOUBLE CLICK'; | ||
| + | String _textoOnLongClick = 'EVENTO LONG CLICK'; | ||
| + | |||
| + | @override | ||
| + | Widget build(BuildContext context) { | ||
| + | return Scaffold( | ||
| + | appBar: AppBar( | ||
| + | title: Text('Xestión de Eventos'), | ||
| + | ), | ||
| + | body: ListView( | ||
| + | children: [ | ||
| + | _eventosSobreInkWell() | ||
| + | ], | ||
| + | ) | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | Widget _eventosSobreInkWell(){ | ||
| + | |||
| + | return Column( | ||
| + | |||
| + | children: [ | ||
| + | InkWell( | ||
| + | child: _crearContainer(texto: '$_textoClick',color: Colors.blue, fondo: Colors.yellow), | ||
| + | onTap: () { | ||
| + | setState(() { | ||
| + | _textoClick = 'PULSASTE CON CLICK'; | ||
| + | }); | ||
| + | }, | ||
| + | ), | ||
| + | InkWell( | ||
| + | child: _crearContainer(texto: '$_textoDoubleClick',color: Colors.red, fondo: Colors.yellow), | ||
| + | onDoubleTap: () { | ||
| + | setState(() { | ||
| + | _textoDoubleClick = 'PULSASTE DOUBLE CLICK'; | ||
| + | }); | ||
| + | }, | ||
| + | ), | ||
| + | InkWell( | ||
| + | child: _crearContainer(texto: '$_textoOnLongClick',color: Colors.green, fondo: Colors.yellow), | ||
| + | onLongPress: () { | ||
| + | setState(() { | ||
| + | _textoOnLongClick = 'PULSASTE LONG CLICK'; | ||
| + | }); | ||
| + | }, | ||
| + | ), | ||
| + | ], | ||
| + | |||
| + | ); | ||
| + | |||
| + | } | ||
| + | |||
| + | Widget _crearContainer({required String texto, required Color color, required Color fondo}) { | ||
| + | return Container( | ||
| + | margin: EdgeInsets.only(top:10), | ||
| + | height: 70, | ||
| + | width: 300, | ||
| + | color: fondo, | ||
| + | child: Text('$texto',textAlign: TextAlign.center,style: TextStyle(color: color,fontWeight: FontWeight.bold,fontSize: 30),), | ||
| + | ); | ||
| + | |||
| + | } | ||
| + | } | ||
| + | |||
| + | </syntaxhighlight> | ||
| + | |||
| + | |||
| + | <br /> | ||
| + | ==GestureDetector== | ||
| + | |||
Sobre container => https://stackoverflow.com/questions/44317188/flutter-ontap-method-for-containers | Sobre container => https://stackoverflow.com/questions/44317188/flutter-ontap-method-for-containers | ||
Revisión del 17:18 22 sep 2021
Introducción
- Ya vimos en la sección anterior de formularios como gestionar los diferentes eventos que se puedan producir en los elementos gráficos que conforman un formulario.
- Pero puede ser necesario que queramos gestionar algún evento sobre un Widget el cual no tenga asociado ninguna función de gestión de eventos sobre el mismo en su constructor.
- Veremos en este punto, cómo podemos implementar estos eventos.
- Creamos una nueva página en la carpeta pages de nombre eventos_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 (EventosPage) que derive de StatefulWidget. Se creará (si lo hacéis con un Snippet) una clase asociada que deriva de State.
- Modificamos la clase State y en su métod build hacemos que devuelva un Scaffold con una Appbar (hacerlo con un Snippet)
InkWell
- Más información en: https://api.flutter.dev/flutter/material/InkWell-class.html
- Nota: Para emplear este Widget es necesario que exista un Material Widget en alguno de sus ancestros en la jerarquía de Widget.
- Podéis consultar que eventos se pueden gestionar con este Widget en las propiedades del mismo que comienzan con onPPPPPPP.
- En el siguiente ejemplo vamos a ver las que normalmente vais necesitar emplear, con el click (onTap) o doble click (onDoubleTap), mantener presionado (onLongPress).
import 'package:flutter/material.dart'; class EventosPage extends StatefulWidget { const EventosPage({Key? key}) : super(key: key); @override _EventosPageState createState() => _EventosPageState(); } class _EventosPageState extends State<EventosPage> { String _textoClick='Evento CLICK'; String _textoDoubleClick = 'EVENTO DOUBLE CLICK'; String _textoOnLongClick = 'EVENTO LONG CLICK'; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Xestión de Eventos'), ), body: ListView( children: [ _eventosSobreInkWell() ], ) ); } Widget _eventosSobreInkWell(){ return Column( children: [ InkWell( child: _crearContainer(texto: '$_textoClick',color: Colors.blue, fondo: Colors.yellow), onTap: () { setState(() { _textoClick = 'PULSASTE CON CLICK'; }); }, ), InkWell( child: _crearContainer(texto: '$_textoDoubleClick',color: Colors.red, fondo: Colors.yellow), onDoubleTap: () { setState(() { _textoDoubleClick = 'PULSASTE DOUBLE CLICK'; }); }, ), InkWell( child: _crearContainer(texto: '$_textoOnLongClick',color: Colors.green, fondo: Colors.yellow), onLongPress: () { setState(() { _textoOnLongClick = 'PULSASTE LONG CLICK'; }); }, ), ], ); } Widget _crearContainer({required String texto, required Color color, required Color fondo}) { return Container( margin: EdgeInsets.only(top:10), height: 70, width: 300, color: fondo, child: Text('$texto',textAlign: TextAlign.center,style: TextStyle(color: color,fontWeight: FontWeight.bold,fontSize: 30),), ); } }
GestureDetector
Sobre container => https://stackoverflow.com/questions/44317188/flutter-ontap-method-for-containers