Reproductor de música: Controles
Parte de la sección Diseños que se adaptan del Journey de Flutter de Coddy. Lección 29 de 30.
La última fila contiene los botones: anterior, reproducir y siguiente. Deben compartir el ancho de forma uniforme, con el botón de reproducción exactamente en el medio, en cualquier teléfono.
Al envolver cada IconButton en Expanded, cada uno ocupa un tercio de la fila y el botón queda en el centro de su tercio. Dale al botón de reproducción un iconSize: más grande para que destaque.
El botón de reproducción cambia: muestra Icons.pause mientras suena la canción y Icons.play_arrow cuando no suena. Eso es un bool en el estado y un ? : para elegir el icono.
Desafío
FácilDebajo de los tiempos, después de un SizedBox(height: 16), añade un Row con tres widgets Expanded IconButton:
Icons.skip_previous,iconSize: 40- el botón de reproducción,
iconSize: 64:Icons.pausemientras un nuevo campobool _playing = false;sea verdadero,Icons.play_arrowmientras sea falso; al tocarlo, cambia el valor de_playingensetState Icons.skip_next,iconSize: 40
Pruébalo tú mismo
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
double _position = 0.3;
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: Scaffold(
appBar: AppBar(title: const Text('Now Playing')),
body: Padding(
padding: const EdgeInsets.all(24),
child: Column(
children: [
Stack(
children: [
Container(
width: double.infinity,
height: 300,
decoration: BoxDecoration(
color: Colors.deepPurple,
borderRadius: BorderRadius.circular(24),
),
child: const Center(
child: Icon(Icons.album, size: 120, color: Colors.white),
),
),
Positioned(
top: 12,
right: 12,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: Colors.black54,
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'HD',
style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
),
),
),
],
),
const SizedBox(height: 24),
const Text(
'Midnight Drive',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
const SizedBox(height: 4),
const Text('The Night Owls', style: TextStyle(color: Colors.grey)),
const SizedBox(height: 16),
Slider(
value: _position,
onChanged: (value) {
setState(() {
_position = value;
});
},
),
const Row(
children: [
Text('1:12'),
Spacer(),
Text('3:45'),
],
),
],
),
),
),
);
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Diseños que se adaptan
1Compartir una fila
Expanded ocupa toda la filaCompartir espacio con flexFlexible se ajusta a su hijoSpacer separa los elementos4Tamaños y puntos de ruptura
Ancho completo: double.infinityUn ancho máximoTamaño de pantalla: MediaQueryPuntos de ruptura con LayoutBuilder7Proyecto: Reproductor de música
Reproductor de música: Portada del álbumReproductor de música: Información de la canción2El error de desbordamiento
El error de desbordamientoSolución al desbordamiento: expandirSolución al desbordamiento: desplazamientoSolución al desbordamiento: ajustarEspaciado dentro de un ajuste5Enumeraciones y switch
Enumeraciones para tipos de pantallaUsar switch con una enumeraciónExpresiones switchPractica por tu cuenta: Compilador de Flutter online