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 MalikAsad 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...
-Vilmir4 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 Android8 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.
- Kamlesh29 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
Respondido27 de marzo de 2021 a las 19:21
hbamithkumarahbamithkumara
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 Mughal27/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.
- hbamithkumara27/03/2021 a las 19:46
gracias @hbamithkumara... funcionó de maravilla...
- Aqeel Mughal29 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 thapasantosh thapa
224
2
2 insignias de plata
8
8 insignias de bronce
2
1
estilo:Botón elevado.styleFrom(primario:Colores.ámbar)
- santosh thapa27/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.
- Kamlesh29 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
ParSaParSa
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
Abrigo666Abrigo666
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 ChauhanLokendra 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 al22 de junio de 2023 a las 5:46
Oj_M4gicOj_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 KonanKoffi 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.
Respondido21 de diciembre de 2021 a las 23:36
Amit chaudharyAmit 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.
ComunidadBot
22 de diciembre de 2021 a las 6:01
¿Agregar dónde? ¿Puedes dar más detalles?
-Peter Mortensen17 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 al22 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 respondido15 de octubre de 2023 a las 15:40
mariam elfkymariam 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.
ComunidadBot
27 de octubre de 2023 a las 7:58