Menu
CoddyTech
flag Ar iconالعربيةdown icon

مشغل الموسيقى: الوضع الفاتح والداكن

جزء من قسم تصميم يتكيف مع الشاشة في رحلة Flutter على Coddy. الدرس 30 من 30.

يستمع الناس إلى الموسيقى ليلًا، لذلك يحصل المشغّل على وضع داكن، مع زر في الشريط العلوي للتبديل إليه.

يأخذ AppBar الخاصية actions:، وهي قائمة أزرار تظهر عند طرفه الأيمن. يبدّل أحد أزرار IconButton هناك قيمة bool في الحالة، وتتبعها themeMode:. يوضّح رمز الزر وظيفته: هلال، Icons.dark_mode، عندما يكون المشغّل في الوضع الفاتح، وشمس، Icons.light_mode، عندما يكون في الوضع الداكن.

يتغير كل لون على الشاشة مصدره السمة معها: الخلفية والنص وشريط التمرير والأزرار. أما صورة الألبوم فتحافظ على لونها الخاص، كما تفعل أي صورة.

challenge icon

التحدي

سهل

أضف الوضع الداكن:

  • حقل 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: () {},
                    ),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس تصميم يتكيف مع الشاشة

تدرّب بنفسك: مترجم Flutter عبر الإنترنت