Menu
CoddyTech

קבלת תוצאה בחזרה

חלק מהיחידה רשימות ומסכים במסלול ה-Flutter של Coddy. שיעור 22 מתוך 33.

יש מסכים שנועדו לשאול שאלה: לבחור צבע, לבחור תאריך. התשובה צריכה לחזור למסך ששאל. Navigator.pop יכול להעביר אותה:

Navigator.pop(context, 'Green');

בצד השני, Navigator.push מחזיר Future: ערך שמגיע מאוחר יותר, כשהמסך שנפתח נסגר. await ממתין לו, והפונקציה שממתינה מסומנת כ-async:

onPressed: () async {
  final String? color = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => const ColorScreen()),
  );
  if (color != null) {
    setState(() {
      chosen = color;
    });
  }
},

התוצאה היא String?: כשמישהו יוצא באמצעות חץ החזרה, לא נשלח דבר ו-color הוא null. ה-if שומר אז על הבחירה הקודמת. יחידה מאוחרת יותר מספרת את הסיפור המלא של Future ו-await.

challenge icon

אתגר

בינוני

בחירת צבע סוגרת את מסך הצבע, אבל מסך הבית לא מקבל על כך עדכון. החזירו את הבחירה:

  • במסך הצבע, השתמשו ב־pop עם הצבע: Navigator.pop(context, color)
  • במסך הבית, המתינו ל־push באמצעות await, וכשצבע חוזר, הציגו Your color: Green (עם הצבע שנבחר)
  • יציאה באמצעות חץ החזרה משאירה את הטקסט הישן

נסו בעצמכם

import 'package:flutter/material.dart';

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

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

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

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

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String chosen = 'none';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Paint')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('Your color: $chosen', style: const TextStyle(fontSize: 24)),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const ColorScreen()),
                );
              },
              child: const Text('Choose a color'),
            ),
          ],
        ),
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Pick a color')),
      body: ListView(
        children: [
          for (String color in ['Red', 'Green', 'Blue'])
            ListTile(
              title: Text(color),
              onTap: () {
                Navigator.pop(context);
              },
            ),
        ],
      ),
    );
  }
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה רשימות ומסכים

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