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

المُعرِّفات في أصنافك

جزء من قسم إدارة الحالة في رحلة Flutter على Coddy. الدرس 6 من 27.

لا تحتاج بعض القيم إلى تخزينها، لأنها تُستنتج من قيم أخرى. عدد الأكواب المتبقية هو الهدف مطروحًا منه عدد الأكواب التي شربتها حتى الآن. تعمل دالة الوصول على حساب ذلك كلما طلبت منها:

class WaterLog {
  int glasses = 0;
  int goal = 8;

  int get left => goal - glasses;
  bool get done => glasses >= goal;
}

لدالة الوصول نوع، وكلمة get واسم، من دون أقواس. تعني => «النتيجة هي». تقرؤها كما تقرأ الحقل: log.left، وليس أبدًا log.left().

يحتفظ الحقل بالعدد الذي كانت قيمته عند ضبطه. أما دالة الوصول فيُعاد حسابها عند كل قراءة، لذا لا تصبح قديمة أبدًا: اشرب كوبًا، وستكون قيمة log.left أقل بواحد في عملية البناء التالية.

challenge icon

التحدي

سهل

تُجري الصفحة الحسابات بنفسها، وعندما يتحقق الهدف يصبح العدد أقل من الصفر. انقل القواعد إلى WaterLog:

  • أضف خاصية getter باسم left: الهدف ناقص عدد الأكواب.
  • أضف خاصية getter باسم done: تكون true عندما يصل عدد الأكواب إلى الهدف.
  • اعرض Goal reached! عندما تكون log.done صحيحة، وإلا فاعرض 8 to go، ثم 7 to go، وهكذا باستخدام log.left.

جرّب بنفسك

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class WaterLog {
  int glasses = 0;
  int goal = 8;

  void drink() {
    glasses = glasses + 1;
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final log = WaterLog();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Water')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              '${log.goal - log.glasses} to go',
              style: const TextStyle(fontSize: 32),
            ),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  log.drink();
                });
              },
              child: const Text('Drink a glass'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconاختبر نفسك

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

جميع دروس إدارة الحالة

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