Menu
CoddyTech

חיבור איברי רשימה באמצעות fold

חלק מהיחידה ניהול מצב במסלול ה-Flutter של Coddy. שיעור 8 מתוך 27.

רשימת הוצאות צריכה סכום כולל. אפשר לעבור עליה בלולאה ולחבר את הערכים, אבל יש לרשימה מתודה שעושה בדיוק את זה: fold. היא עוברת על הרשימה, ומעבירה ערך אחד מפריט לפריט:

double total = expenses.fold(0.0, (sum, e) => sum + e.amount);

קראו את זה כך: מתחילים ב־0.0. עבור כל הוצאה e, ה־sum החדש הוא ה־sum הקודם ועוד e.amount. כשהרשימה מסתיימת, ה־sum האחרון הוא התוצאה. עבור 3.5 ו־12, הערכים הם 0.0, אחר כך 3.5, ואז 15.5.

הפונקציה חייבת להחזיר את הסכום החדש. אם היא מחזירה רק את e.amount, בכל שלב נשכח הערך שלפניו, וה״סכום הכולל״ יהיה המחיר האחרון.

הרשימה עצמה יכולה להשתנות: expenses.add(...) בתוך setState מוסיף הוצאה נוספת, ובבנייה הבאה יחושב הסכום של הרשימה החדשה.

challenge icon

אתגר

קל

בשורת הסכום הכולל תמיד מופיע $0.00. חשב אותו במקום זאת:

  • הצב ב־total את התוצאה של expenses.fold, תוך חיבור ה־amount של כל הוצאה.

השורה כבר מציגה את הסכום עם 2 ספרות אחרי הנקודה העשרונית, לכן היא אמורה להציג Total: $15.50, ולגדול כשמוסיפים חטיף.

נסו בעצמכם

import 'package:flutter/material.dart';

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

class Expense {
  Expense({required this.name, required this.amount});

  final String name;
  final double amount;
}

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 List<Expense> expenses = [
    Expense(name: 'Coffee', amount: 3.5),
    Expense(name: 'Lunch', amount: 12),
  ];

  @override
  Widget build(BuildContext context) {
    double total = 0;
    return Scaffold(
      appBar: AppBar(title: const Text('Expenses')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            for (final e in expenses) Text('${e.name}: \$${e.amount.toStringAsFixed(2)}'),
            const SizedBox(height: 16),
            Text('Total: \$${total.toStringAsFixed(2)}', style: const TextStyle(fontSize: 28)),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  expenses.add(Expense(name: 'Snack', amount: 2.25));
                });
              },
              child: const Text('Add a snack'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה ניהול מצב

תרגלו בעצמכם: קומפיילר Flutter אונליין