Lettore musicale: Controlli
Fa parte della sezione Layout adattabili del percorso Flutter di Coddy. Lezione 29 di 30.
L’ultima riga contiene i pulsanti: precedente, riproduci e successivo. Dovrebbero occupare la larghezza in parti uguali, con il pulsante di riproduzione esattamente al centro, su qualsiasi telefono.
Racchiudendo ogni IconButton in Expanded, ciascuno occupa un terzo della riga e il pulsante si trova al centro del proprio terzo. Assegna al pulsante di riproduzione un iconSize: più grande, così risalterà.
Il pulsante di riproduzione cambia: mostra Icons.pause mentre la canzone è in riproduzione e Icons.play_arrow quando non lo è. Per farlo, servono un bool nello stato e un ? : per scegliere l’icona.
Sfida
FacileSotto i tempi, dopo un SizedBox(height: 16), aggiungi una Row con tre widget Expanded IconButton:
Icons.skip_previous,iconSize: 40- il pulsante di riproduzione,
iconSize: 64:Icons.pausequando un nuovo campobool _playing = false;è true,Icons.play_arrowquando è false; toccandolo,_playingcambia valore insetState Icons.skip_next,iconSize: 40
Provalo tu
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'),
],
),
],
),
),
),
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Layout adattabili
1Condividere una riga
Expanded riempie la rigaCondividere lo spazio con flexFlexible si adatta al suo elemento figlioSpacer tiene gli elementi separati4Dimensioni e breakpoint
Larghezza completa: double.infinityUna larghezza massimaDimensioni dello schermo: MediaQueryBreakpoint con LayoutBuilder7Progetto: Lettore musicale
Lettore musicale: Copertina dell’albumLettore musicale: Informazioni sul branoEsercitati da solo: Compilatore Flutter online