مشغل الموسيقى: الوضع الفاتح والداكن
جزء من قسم تصميم يتكيف مع الشاشة في رحلة Flutter على Coddy. الدرس 30 من 30.
يستمع الناس إلى الموسيقى ليلًا، لذلك يحصل المشغّل على وضع داكن، مع زر في الشريط العلوي للتبديل إليه.
يأخذ AppBar الخاصية actions:، وهي قائمة أزرار تظهر عند طرفه الأيمن. يبدّل أحد أزرار IconButton هناك قيمة bool في الحالة، وتتبعها themeMode:. يوضّح رمز الزر وظيفته: هلال، Icons.dark_mode، عندما يكون المشغّل في الوضع الفاتح، وشمس، Icons.light_mode، عندما يكون في الوضع الداكن.
يتغير كل لون على الشاشة مصدره السمة معها: الخلفية والنص وشريط التمرير والأزرار. أما صورة الألبوم فتحافظ على لونها الخاص، كما تفعل أي صورة.
التحدي
سهلأضف الوضع الداكن:
- حقل
bool _dark = false; - سمة
darkTheme:من اللون الأساسيColors.deepPurpleمعbrightness: Brightness.dark، وthemeMode:يتم اختياره بناءً على_dark - في
actions:الخاصة بـAppBar، زرIconButtonيعرضIcons.light_modeعندما يكون الوضع داكنًا وIcons.dark_modeعندما يكون الوضع فاتحًا، ويبدّل قيمة_darkداخلsetState
جرّب بنفسك
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: () {},
),
),
],
),
],
),
),
),
);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس تصميم يتكيف مع الشاشة
1التشارك في الصف
Expanded يملأ الصفمشاركة المساحة باستخدام flexFlexible يحتضن عنصره الفرعيSpacer يباعد بين العناصر4الأحجام ونقاط التوقف
العرض الكامل: double.infinityعرض أقصىحجم الشاشة: MediaQueryنقاط التوقف باستخدام LayoutBuilder7مشروع: مشغل الموسيقى
مشغل الموسيقى: غلاف الألبوممشغل الموسيقى: معلومات الأغنيةتدرّب بنفسك: مترجم Flutter عبر الإنترنت