חיבור איברי רשימה באמצעות 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 מוסיף הוצאה נוספת, ובבנייה הבאה יחושב הסכום של הרשימה החדשה.
אתגר
קלבשורת הסכום הכולל תמיד מופיע $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'),
),
],
),
),
);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ניהול מצב
2Dart עבור מודלים
מתודות במחלקות שלכםGetters במחלקות שלכםהפכו שדה לפרטיחיבור איברי רשימה באמצעות foldתרגלו בעצמכם: קומפיילר Flutter אונליין