Android Studio 4.2: ¿Cómo puedo cambiar el color de fondo del botón elevado en Flutter desde la función?

CorePress2024-01-25  9

Soy nuevo en Flutter y comencé Flutter la semana pasada. Y ahora quiero hacer una aplicación sencilla de Xilófono. Creé la interfaz de usuario con éxito e hice una función reproducirSound(int soundNumber), pero cuando llamo a esta función para reproducir sonido, me da este error.

Se produjo el siguiente _TypeError al compilar el cuerpo (sucio, estado: _BodyState#051c2): el tipo '_MaterialStatePropertyAll' no es un subtipo del tipo 'MaterialStateProperty<Color?>?'

Aquí está el código que escribí para la función playSound(int soundNumber).

void playSound(int soundNumber) {
  final player = AudioCache();
  player.play('note$soundNumber.wav');
}

Expanded buildPlayButton({MaterialStateProperty color, int soundNumber}) {
  return Expanded(
    child: ElevatedButton(
      onPressed: () {
        playSound(soundNumber);
      },
      style: ButtonStyle(
        backgroundColor: color,
      ),
    ),
  );
}

Aquí está el punto donde llamo a esta función.

Widget build(BuildContext context) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: <Widget>[
      buildPlayButton(color: MaterialStateProperty.all(Colors.red), soundNumber: 1),
      buildPlayButton(color: MaterialStateProperty.all(Colors.orangeAccent), soundNumber: 2),
      buildPlayButton(color: MaterialStateProperty.all(Colors.yellow), soundNumber: 3),
      buildPlayButton(color: MaterialStateProperty.all(Colors.indigo), soundNumber: 4),
      buildPlayButton(color: MaterialStateProperty.all(Colors.blue), soundNumber: 5),
      buildPlayButton(color: MaterialStateProperty.all(Colors.lightGreenAccent), soundNumber: 6),
      buildPlayButton(color: MaterialStateProperty.all(Colors.green), soundNumber: 7),
    ],
  );
}

¿Cómo puedo llamar a esta función si me da el error mencionado anteriormente?



------------------------------------

Puedes aplicar estilo a ElevatedButton utilizando el método estático styleFrom o la clase ButtonStyle. El primero es más conveniente que el segundo.

Usar styleFrom para aplicar estilo a un ElevatedButton:

ElevatedButton(
      child: Text('Button'),
      onPressed: () {},
      style: ElevatedButton.styleFrom({
           Color backgroundColor, // set the background color
           Color foregroundColor,
           Color disabledForegroundColor,
           Color shadowColor,
           double elevation,
           TextStyle textStyle,
           EdgeInsetsGeometry padding,
           Size minimumSize,
           BorderSide side,
           OutlinedBorder shape,
           MouseCursor enabledMouseCursor,
           MouseCursor disabledMouseCursor,
           VisualDensity visualDensity,
           MaterialTapTargetSize tapTargetSize,
           Duration animationDuration,
           bool enableFeedback
     }),
),

Ejemplo:

ElevatedButton(
            child: Text('Button'),
            onPressed: () {},
            style: ElevatedButton.styleFrom(
                backgroundColor: Colors.purple,
                padding: EdgeInsets.symmetric(horizontal: 50, vertical: 20),
                textStyle: TextStyle(
                fontSize: 30,
                fontWeight: FontWeight.bold)),
),

Usar ButtonStyle para aplicar estilo a un ElevatedButton:

style: ButtonStyle({
  MaterialStateProperty<TextStyle> textStyle,
  MaterialStateProperty<Color> backgroundColor,
  MaterialStateProperty<Color> foregroundColor,
  MaterialStateProperty<Color> overlayColor,
  MaterialStateProperty<Color> shadowColor,
  MaterialStateProperty<double> elevation,
  MaterialStateProperty<EdgeInsetsGeometry> padding,
  MaterialStateProperty<Size> minimumSize,
  MaterialStateProperty<BorderSide> side,
  MaterialStateProperty<OutlinedBorder> shape,
  MaterialStateProperty<MouseCursor> mouseCursor,
  VisualDensity visualDensity,
  MaterialTapTargetSize tapTargetSize,
  Duration animationDuration,
  bool enableFeedback
})

Ejemplo

ElevatedButton(
            child: Text('Button'),
            onPressed: () {},
            style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.red),
                padding: MaterialStateProperty.all(EdgeInsets.all(50)),
                textStyle: MaterialStateProperty.all(TextStyle(fontSize: 30))),
),
Respondido

22 de abril de 2021 a las 10:31

Asad Malik

Asad Malik

3,218

1

1 insignia de oro

6

6 insignias de plata

8

8 bronceinsignias electrónicas

3

Gracias por la respuesta, pero no entiendo por qué no puedo hacer Theme.of(context).elevatedButtonTheme.copyWith(backgroundColor: ...) ElevatedButtonTheme es nulo en tiempo de ejecución. No entiendo por qué, ya que otros temas no son nulos...

-Vilmir

4 de octubre de 2021 a las 12:09

1

propiedad "primaria" para establecer el color de fondo ahora está en desuso. Utilice "color de fondo" en su lugar.

- clase Android

8 de febrero de 2023 a las 5:29

obteniendo el error 'principal' está en desuso y no debe utilizarse. Utilice backgroundColor en su lugar. Esta característica quedó obsoleta después de la versión 3.1.0. Intente reemplazar el uso del miembro obsoleto con el reemplazo.

- Kamlesh

29 de octubre de 2023 a las 8:39



------------------------------------

Pasecolor como parámetro y utilice MaterialStateProperty.all<Color>(color) para especificar el color.

buildPlayButton(color: Colors.red, soundNumber: 1)
Expanded buildPlayButton({Color color, int soundNumber}){
  return Expanded(
    child: ElevatedButton(
      onPressed: () {
        playSound(soundNumber);
      },
      style: ButtonStyle(
        backgroundColor: MaterialStateProperty.all<Color>(color),
      ),
    ),
);}
Botón de muestra

En general

ElevatedButton(
  style: ElevatedButton.styleFrom(
    primary: Colors.red, // background
    onPrimary: Colors.yellow, // foreground
  ),
  onPressed: () {},
  child: Text('ElevatedButton with custom foreground/background'),
)

Botón de muestra

Referencia:

Clase ElevatedButton

Respondido

27 de marzo de 2021 a las 19:21

hbamithkumara

hbamithkumara

2,384

1

1 insignia de oro

17

17 insignias de plata

17

17 insignias de bronce

3

¿Qué argumentos tengo que pasar al agregar esto dentro de una función?

- Aqeel Mughal

27/03/2021 a las 19:25

He actualizado la publicación. Pase el color como parámetro y utilice MaterialStateProperty.all<Color>(color) para especificar el color.

- hbamithkumara

27/03/2021 a las 19:46

gracias @hbamithkumara... funcionó de maravilla...

- Aqeel Mughal

29 de marzo de 2021 a las 6:53



------------------------------------

ElevatedButton(onPressed: resetHandler,
               child: Text("button"),
               style: ElevatedButton.styleFrom(primary: Colors.amber),),
Respondido

27 de marzo de 2021 a las 19:49

santosh thapa

santosh thapa

224

2

2 insignias de plata

8

8 insignias de bronce

2

1

estilo:Botón elevado.styleFrom(primario:Colores.ámbar)

- santosh thapa

27/03/2021 a las 19:51

obteniendo error - 'primario' está en desuso y no debe utilizarse. Utilice backgroundColor en su lugar. Esta característica quedó obsoleta después de la versión 3.1.0. Intente reemplazar el uso del miembro obsoleto con el reemplazo.

- Kamlesh

29 de octubre de 2023 a las 8:00:38



------------------------------------

Solo usa MaterialStateProperty.all(**TU COLOR**):

ElevatedButton(
            child: Text('Button'),
            onPressed: () {},
            style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.red),)
),

o así: Simplemente use ElevatedButton.styleFrom(primary: **TU COLOR**):

ElevatedButton(
            child: Text('Button'),
            onPressed: () {},
            style: ElevatedButton.styleFrom(primary: Colors.red),
)



------------------------------------

Tienes tres opciones para cambiar el color de fondo:

Botón elevado.estiloDe:

Si solo desea cambiar el color de fondo y el color de primer plano independientemente de los estados, puede hacer lo que se indica a continuación.

ElevatedButton(
  style: ElevatedButton.styleFrom(
    primary: Colors.red, // Background
    onPrimary: Colors.white, // Foreground
  ),
  onPressed: () { },
  child: Text('custom foreground/background'),
)

MaterialStateProperty.all:

para anular un fondo predeterminado de ElevatedButtons(text/icon) color para todos los estados.

 ElevatedButton(style:
    ButtonStyle(
      backgroundColor: MaterialStateProperty.all(Colors.red),
    onPressed: () { },
    child: Text('custom foreground/background'),
    ));

MaterialStateProperty.resolveCon:

De forma predeterminada, el botón elevado hereda un color azul. Podemos modificar el estilo predeterminado usando el parámetro de estilo y la clase ButtonStyle. El botón tiene diferentes estados, como presionado, deshabilitado, suspendido, etc. Puede cambiar el estilo para cada estado. En el siguiente fragmento, el color predeterminado del botón cambia a verde cuando se presiona.

ElevatedButton(
  style: ButtonStyle(
    backgroundColor: MaterialStateProperty.resolveWith<Color>(
      (Set<MaterialState> states) {
        if (states.contains(MaterialState.pressed))
          return Colors.green;
        return null; // Use the component's default.
      },
    ),
  ),
)
Respondido al

1 de enero de 2022 a las 13:18

ParSa

ParSa

1.237

1

1 insignia de oro

14

14 insignias de plata

17

17 insignias de bronce



------------------------------------

Entonces, ¿supongamos que necesitamos cambiar el color de fondo del botón elevado? El botón elevado tiene una propiedad de estilo y la propiedad de estilo necesita ButtonStyle(). ButtonStyle tiene la propiedad backgroundColor que requiere MaterialStateProperty. Simplemente puede asignar el color de fondo mediante MaterialStateProperty.all(Colors.green). Exploremos ejemplos de color de fondo del botón elevado en Flutter.

ElevatedButton(
          onPressed: () {
            print('Button Pressed');
          },
          style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all<Color>(Colors.green),
          ),
          child: Text('Send'),
        ),



------------------------------------

------------------

La mejor respuesta actual con el ejemplo ElevatedButton.styleFrom está desactualizada. A partir de Flutter v3.1.0, el parámetro principal está obsoleto.

Color? primary // Use foregroundColor instead. This feature was deprecated after v3.1.0.

En su lugar, utilice el parámetro backgroundColor:

ElevatedButton(
  style: ElevatedButton.styleFrom(
    backgroundColor: const Colors.red,
  ),
  onPressed: () {},
  child: const Text('Test'),
)
Respondido

11 de octubre de 2022 a las 9:15

Abrigo666

Abrigo666

111

2

2 insignias de plata

5

5 insignias de bronce



------------------------------------

-------------- ------------------

Captura de pantalla:

Código:

class _MyState extends State<MyPage> {
  bool _flag = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () => setState(() => _flag = !_flag),
          child: Text(_flag ? 'Red' : 'Green'),
          style: ElevatedButton.styleFrom(
            backgroundColor: _flag ? Colors.red : Colors.teal, // This is what you need!
          ),
        ),
      ),
    );
  }
}



------------------------------------

Simplemente puedes usar este código dentro del ElevatedButton

 style: ElevatedButton.styleFrom(
       backgroundColor:Theme.of(context).primaryColor
    ),
Respondido

7 de octubre de 2022 a las 14:40

Lokendra singh Chauhan

Lokendra singh Chauhan

111

1

1 insignia plateada

4

4 insignias de bronce



------------------------------------

body:Center(

  child: ElevatedButton(
    onPressed: () {},
     child: Text("click me"),
      style:ButtonStyle(
        backgroundColor: MaterialStateProperty.all(Colors.green))
     ),


  ),

} }

Respondido al

22 de junio de 2023 a las 5:46

Oj_M4gic

Oj_M4gic

51

1

1 insignia plateada

2

2 insignias de bronce



------------------------------------

 style: ElevatedButton.styleFrom(
                        shape: RoundedRectangleBorder(
                          borderRadius: new BorderRadius.circular(30.0),
                        ),
                          primary: HexColor(HexColor.primarycolor),
                          textStyle: TextStyle(fontWeight: FontWeight.bold)),



------------------------------------

ElevatedButton(
          onPressed: (){},
          child: Text('comprar'),
          style: ElevatedButton.styleFrom(
            primary: Theme.of(context).primaryColor
          )
        )
Respondido

14 de mayo de 2021 a las 4:43

Koffi Inocente Konan

Koffi Inocente Konan

186

4

4 insignias de bronce



------------------------------------

Necesitas establecer la propiedad principal (dentro de un estilo) y asignarle un color, pero ten cuidado, si no has configurado tu evento onPressed() entonces el color no cambia...

Aquí tienes un ejemplo:

Widget renderMyButton() {
  return ElevatedButton(
      style: ElevatedButton.styleFrom(
        primary: Colors.lightBlue, // Change the color here..
        elevation: 0,
        // ...
      ),

      onPressed: () {}, // This line is important to change the ElevatedButton color..
      child: Container()
  );
}



------------------------------------

Usar estiloDe de ElevatedButton

 ElevatedButton(
      onPressed: (){},
      child: Text('click me'),
      style: ElevatedButton.styleFrom(backgroundColor: Colors.green),
    ),



------------------------------------

style: ButtonStyle({  
  MaterialStateProperty.all(backgroundColor),   
),

Del mismo modo, puede agregar MaterialStateProperty.all(<Value here>) a la mayoría de las propiedades del botón elevado (elevación, relleno, borde, etc.).



------------------------------------

-------------------

Asegúrate de agregar onPressed: () {},

De lo contrario el color será gris.

Respondido

21 de diciembre de 2021 a las 23:36

Amit chaudhary

Amit chaudhary

61

7

7 insignias de bronce

2

2

Su respuesta podría mejorarse con información de respaldo adicional. Por favor edite para agregar más detallesils, como citas o documentación, para que otros puedan confirmar que su respuesta es correcta. Puedes encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

Comunidad

Bot

22 de diciembre de 2021 a las 6:01

¿Agregar dónde? ¿Puedes dar más detalles?

-Peter Mortensen

17 de febrero de 2023 a las 5:05



------------------------------------

Si desea cambiar el color de fondo del botón elevado y el color del contorno también con elforma del círculo, luego revisa este código:

ElevatedButton(
    style: ElevatedButton.styleFrom(
        backgroundColor: Colors.white,
        side: BorderSide(
            width: 1,
            color: primaryBlue),
        shape: RoundedRectangleBorder(
            borderRadius:
                BorderRadius.circular(
          20,
        ))),
    onPressed: () {},
    child: Text(
      'Use camera',
      style: t3b,
    ),
),

Este código se verá así:

Respondido al

22 de agosto de 2022 a las 5:24

ᴅ ᴇ ʙ ᴊ ᴇᴇ ᴛ

ᴅ ᴇ ʙ ᴊ ᴇᴇ ᴛ

484

4

4 insignias de plata

20

20 insignias de bronce



------------------------------------

Botón elevado( estilo: ButtonStyle(fondoColor: MaterialStatePropertyAll(Colors.orange)), onPressed: nulo,);

Compartir mejorar esta respuesta Seguir respondido

15 de octubre de 2023 a las 15:40

mariam elfky

mariam elfky

1

1

1 insignia de bronce

1

Tal como está escrito actualmente, su respuesta no está clara. Edítelo para agregar detalles adicionales que ayudarán a otros a comprender cómo esto aborda la pregunta formulada. Puedes encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

Comunidad

Bot

27 de octubre de 2023 a las 7:58

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare