Lettore musicale: Tema chiaro e scuro
Fa parte della sezione Layout adattabili del percorso Flutter di Coddy. Lezione 30 di 30.
Le persone ascoltano musica di notte, quindi il lettore si dota di una modalità scura, con un pulsante nella barra superiore per attivarla.
Un AppBar accetta actions:, un elenco di pulsanti visualizzati all'estremità destra. Uno degli IconButton inverte un bool nello stato e themeMode: lo segue. L'icona del pulsante indica la sua funzione: una luna, Icons.dark_mode, quando il lettore è in modalità chiara, e un sole, Icons.light_mode, quando è in modalità scura.
Tutti i colori dello schermo che dipendono dal tema cambiano con esso: lo sfondo, il testo, il cursore e i pulsanti. La copertina dell'album mantiene il proprio colore, come farebbe una qualsiasi immagine.
Sfida
FacileAggiungi la modalità scura:
- un campo
bool _dark = false; - un
darkTheme:dal colore semeColors.deepPurpleconbrightness: Brightness.dark, ethemeMode:scelto in base a_dark - nelle
actions:diAppBar, unIconButtonche mostraIcons.light_modequando la modalità è scura eIcons.dark_modequando è chiara, e che inverte_darkinsetState
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;
bool _playing = false;
@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'),
],
),
const SizedBox(height: 16),
Row(
children: [
Expanded(
child: IconButton(
iconSize: 40,
icon: const Icon(Icons.skip_previous),
onPressed: () {},
),
),
Expanded(
child: IconButton(
iconSize: 64,
icon: Icon(_playing ? Icons.pause : Icons.play_arrow),
onPressed: () {
setState(() {
_playing = !_playing;
});
},
),
),
Expanded(
child: IconButton(
iconSize: 40,
icon: const Icon(Icons.skip_next),
onPressed: () {},
),
),
],
),
],
),
),
),
);
}
}
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