مشغل الموسيقى: عناصر التحكم
جزء من قسم تصميم يتكيف مع الشاشة في رحلة Flutter على Coddy. الدرس 29 من 30.
يحتوي الصف الأخير على الأزرار: السابق والتشغيل والتالي. ينبغي أن تتقاسم العرض بالتساوي، مع وضع زر التشغيل في المنتصف تمامًا، على أي هاتف.
يؤدي وضع كل IconButton داخل Expanded إلى تخصيص ثلث الصف لكل زر، ويكون الزر في منتصف هذا الثلث. امنح زر التشغيل قيمة أكبر لـ iconSize: ليبرز.
يتغير زر التشغيل: يعرض Icons.pause أثناء تشغيل الأغنية، وIcons.play_arrow عندما لا تكون قيد التشغيل. يتطلب ذلك قيمة bool في الحالة واستخدام ? : لاختيار الأيقونة.
التحدي
سهلأسفل التوقيتين، وبعد SizedBox(height: 16)، أضف Row يحتوي على ثلاثة عناصر واجهة Expanded من نوع IconButton:
Icons.skip_previous،iconSize: 40- زر التشغيل،
iconSize: 64:Icons.pauseعندما يكون الحقل الجديدbool _playing = false;بقيمة صحيحة، وIcons.play_arrowعندما تكون قيمته خاطئة؛ يؤدي النقر عليه إلى تبديل قيمة_playingداخلsetState Icons.skip_next،iconSize: 40
جرّب بنفسك
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'),
],
),
],
),
),
),
);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس تصميم يتكيف مع الشاشة
1التشارك في الصف
Expanded يملأ الصفمشاركة المساحة باستخدام flexFlexible يحتضن عنصره الفرعيSpacer يباعد بين العناصر4الأحجام ونقاط التوقف
العرض الكامل: double.infinityعرض أقصىحجم الشاشة: MediaQueryنقاط التوقف باستخدام LayoutBuilder7مشروع: مشغل الموسيقى
مشغل الموسيقى: غلاف الألبوممشغل الموسيقى: معلومات الأغنيةتدرّب بنفسك: مترجم Flutter عبر الإنترنت