Como vimos en la clase anterior, para que un widget sea capaz de responder a la interacción con el usuario y en función de esa interacción pueda cambiar su comportamiento o algunas de sus propiedades, este debe ser definido inicialmente como un StatefulWidget.
En esta clase aprenderemos a construir, personalizar y darle comportamiento a un Floating Action Button, nuestro widget de tipo Statful, o con estado.
Este widget, también conocido como Fab, es muy común en las interfaces móviles basadas en Material Design y generalmente representan al elemento de principal interacción esperada en la interfaz, equivale a un Call to action.
La sintaxis básica de un Stateful Widget, es:
import 'package:flutter/material.dart';class<nombre del widget>extendsStatefulWidget{@overrideState<StatefulWidget>createState(){return _<nombre del widget>();}}class _<nombre del widget>extendsState<<nombre del widget>>{void<método de interacción>(){// TODO: interaction code}@overrideWidgetbuild(BuildContext context){// TODO: implement buildreturn<nombre del widget>(... onPressed:<método de interaccion>,// --- sin paréntesis...);}}
import'package:flutter/material.dart';classFloatingActinButtonGreenextendsStatefulWidget{ @override
State<StatefulWidget>createState(){// TODO: implement createStatereturn_FloatingActinButtonGreen();}}class_FloatingActinButtonGreenextendsState<FloatingActinButtonGreen>{ bool _pressed =false;voidonPressedFav(){setState((){ _pressed =!this._pressed;});Scaffold.of(context).showSnackBar(SnackBar(content:this._pressed?Text("Agregaste a tus favoritos"):Text("Quitaste de tus favoritos")));}
@override
Widgetbuild(BuildContext context){// TODO: implement buildreturnFloatingActionButton(backgroundColor:Color(0xFF11DA53),mini:true,tooltip:"Fav",onPressed: onPressedFav,child:Icon(this._pressed?Icons.favorite:Icons.favorite_border),);}}
Buenísima solución!
Exquisito 👌
hola que tal una consulta e visto que muchas veces usas un aligment sobre un container o sobre un stack por ejemplo en esta clase pones la posicion de x / y realmente funciona pero mi consulta es por ejemplo
porque solo se ven afectados por ejemplo en este caso el boton y no toda la tarjeta ( ejemplo ) por ejemplo en este fragmento
returnStack(alignment:Alignment(0.9,1.1),children:<Widget>[ card,FloatingActionButtonGreen()],);```
entiendo todo pero no encuentro la logica de porque solo se ve reflejado el cambio en el boton y no en la tarjeta ..
Yo tengo la misma duda 😕 help
yo tambien tengo la misma duda
Les comparto mi solución para que guarde el estado incluso al hacer scroll. Usamos un mixin llamado AutomaticKeepAliveClientMixin.
Está increíble, sabes si en el curso avanzado de Flutter hablan de los mixin?
Hola, los mixin son un concepto de Dart, yo lo veo como si fuera una interfaz solo que el cuerpo del método va en el mixin y no en la clase que lo implementa. Tiene otras caracteristicas que puedes leer en el siguiente post:
https://medium.com/flutter-community/dart-what-are-mixins-3a72344011f3
Por eso solo con utilizar el mixin y cambiando el valor de wantKeepAlive a true ya se guarda el estado sin que tengas que agregar líneas de código.
Contestando a tu pregunta, en el curso avanzado no tocan este tema, no estoy seguro si en el curso de Dart lo hacen.
Result
Gracias por el aporte
Saludos,
Quiero hacer un aporte: Anahí en el vídeo pasado y en éste confunde el tipo genérico que hay que especificar al heredar de la clase State con colección. Si bien los tipos genéricos se usan mucho en las colecciones, la definición correcta de un tipo genérico es programación basada en un tipo general y no en uno específico. Ejemplo:
import'package:flutter/material.dart';classFloatingActionButtonYellowextendsStatefulWidget{ @override
State<StatefulWidget>createState(){// TODO: implement createStatereturn_FloatingActionButtonYellow();}}class_FloatingActionButtonYellowextendsState<FloatingActionButtonYellow>{ bool _isFavorited =true;voidonPressedFav(){Scaffold.of(context).showSnackBar(SnackBar(content: _isFavorited?Text("Agregado a tus favoritos"):Text("Quitaste de tus favoritos")));setState((){if(_isFavorited){ _isFavorited =false;}else{ _isFavorited =true;}});}
@override
Widgetbuild(BuildContext context){// TODO: implement buildreturnFloatingActionButton(backgroundColor:Colors.amberAccent,mini:true,tooltip:"Fav",onPressed: onPressedFav,child:Icon( _isFavorited?Icons.favorite_border:Icons.favorite),);}}```
Muchas gracias por el aporte no solo por el codigo sino tambien por la fuente de donde sacas la info es de mucha ayuda eso
me parece que esto es súper viejo .... de hecho hay cosas que creo que ya no recomiendan como estándares y buenas practicas de código . Pero por ejemplo no se si a alguien mas no le tomo el backgourdColor , creo que hay que definirlos como parametros requeridos . o no se si alguien lo soluciono de otra manera
El curso es de hace 2 años, bastante antiguo para la velocidad con la que avanza este framework, la gran ventaja es que el mismo editor te dice que cosas están deprecadas, te tacha la parte del código y te advierte con el deprecated, pero hay que tener en cuenta que este es un curso para principiantes.
De todas formas hay que pedirle al Teamplatzi que porfa actualicen el curso, ya es hora
Todo bien con todas las soluciones brindadas, pero si movés el ListView de un extremo a otro el bool se vuelve a false y el ícono cambia. Alguna solución?
¿Encontraste solución? Yo tengo exactamente la misma duda.
En esta linea de codigo tenemos el alignment , pero tengo duda de porque solo afecta a un elemento y no a todos?
Too Late!!! Llegué 2 años tarde para la pregunta. Supongo que ya lo sabes. En caso de que no o en caso de que alguien más se haga la misma pregunta en el futuro:
R: Yo supongo que sólo afecta al Floating button porque el Card ya tiene establecidas sus posiciones en su propia clase. :) espero sea correcta mi suposición. :)
class_FloatingActionButtonGreenextendsState<FloatingActionButtonGreen>{ bool isFavorite =false;
@override
Widgetbuild(BuildContext context){returnFloatingActionButton(/** No debe llevar parentesis **/onPressed: onPressedFab,backgroundColor:Color(0xFF11DA53),mini:true,tooltip:"Fab",child:Icon(this.isFavorite?Icons.favorite:Icons.favorite_border),);}voidonPressedFab(){setState((){this.isFavorite=!this.isFavorite;});Scaffold.of(context).showSnackBar(SnackBar(content:Text(this.isFavorite?"Agregado a tus favoritos":"Eliminado de tus favoritos"),));}}
Aqui les dejo mi resolución :D, también agregue un widget con estado a la páctalla del listado de profesionales. En dicha pantalla el botón esta creado conn una widget Ink e InkWell y el cambio de color lo hace cambiando de estado una variable y luego usándola en un if ternario
Solo había que modificar el método "onPressed" que se asocia al botón y agregar una condicional a los colores de fondo y contorno del icono. En si , todo se hace en la clase que hereda de State
var isPressed =false;voidonPressedFav(){setState((){ isPressed =!isPressed;Scaffold.of(context).showSnackBar(SnackBar(content:Text( isPressed?"Agregaste a tus favoritos.":"Lo quitaste de favoritos"),));});}
@override
Widgetbuild(BuildContext context){// TODO: implement buildreturnFloatingActionButton(backgroundColor: isPressed?Color(0xFF11DA53):Colors.yellow,mini:true,tooltip:"Fav",onPressed: onPressedFav,child:Icon(Icons.favorite_border,color:!isPressed?Colors.white:Colors.black));}
Listo esta porción de código va en el método onPressedFav