Saltar al contenido

Cómo cambiar el color de fondo del botón elevado dinámicamente en onPressed()

Este grupo de expertos despúes de días de investigación y de recopilar de información, dieron con la respuesta, esperamos que te resulte útil para tu trabajo.

Solución:

Fue difícil implementar su código debido a clases y variables indefinidas, sin embargo, creé un pequeño ejemplo que lo ayudará a encontrar lo que está buscando.

List _list = [true, false, true, false];

@override
Widget build(BuildContext context) 
  return Scaffold(
    appBar: AppBar(title: Text("Title")),
    body: ListView(children: _buildButtons()),
  );


List _buildButtons() 
  List listButtons = List.generate(_list.length, (i) 
    return RaisedButton(
      color: _list[i] ? Colors.green : Colors.red,
      onPressed: () 
        setState(() 
          _list[i] = !_list[i];
        );
      ,
      child: Text("Button #$i"),
    );
  );
  return listButtons;

Producción:

ingrese la descripción de la imagen aquí

A menos que me equivoque, lo que estás tratando de hacer ya está manejado por flutter. Creo que todo lo que tienes que hacer es establecer el hightlightColor del botón y al pulsarlo cambiará a ese color. Y puede configurar esto en el tema de toda su aplicación para que todos los botones se comporten de la misma manera en lugar de configurarlo para cada botón individual.

Sin embargo, también hay una razón por la que lo que estás haciendo no funciona. No ha incluido suficiente código para que yo lo diga, pero creo que la razón por la que lo que está haciendo no funciona es que tiene una Lista de datos que está mutando cuando se presiona el botón (es decir, zones[i].isSelected = false;). Estás haciendo eso en un setState, pero la forma en que Flutter verifica si algo necesita reconstrucción es haciendo una comparación de igualdad en los miembros del Estado (es decir, verificará si zones == zones).

Debido a que ‘zonas’ es solo una lista, y en realidad es la misma lista para el estado anterior y el estado nuevo, flutter asumirá que nada ha cambiado y no se molestará en reconstruir.

Hay dos maneras fáciles de evitar esto. Una sería hacer una copia de la lista cada vez que se modifica y establecer el zones miembro a eso, de modo que cuando flutter hace la comparación old.zones != new.zones. La otra forma sería mantener un objeto separado que cambie cada vez que se modifique la lista (tiendo a usar un número entero llamado changeCounter que incremento cada vez que cambia la lista), ya que de esa manera puede ‘engañar’ a la reconstrucción.

Si haces scroll puedes encontrar los comentarios de otros gestores de proyectos, tú incluso puedes dejar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *