קבלת תוצאה בחזרה
חלק מהיחידה רשימות ומסכים במסלול ה-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.
אתגר
בינוניבחירת צבע סוגרת את מסך הצבע, אבל מסך הבית לא מקבל על כך עדכון. החזירו את הבחירה:
- במסך הצבע, השתמשו ב־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);
},
),
],
),
);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה רשימות ומסכים
תרגלו בעצמכם: קומפיילר Flutter אונליין