כפתור לניסיון חוזר
חלק מהיחידה נתונים ורשת במסלול ה-Flutter של Coddy. שיעור 14 מתוך 27.
החיבורים חוזרים. מסך שגיאה טוב לא משאיר את האדם תקוע: הוא מסביר מה קרה ומציע דרך לנסות שוב.
ניסיון חוזר הוא טעינה מחדש: יוצרים עתיד חדש בתוך setState, כמו בלחיצה על כפתור רענון.
void tryAgain() {
setState(() {
_message = fetch('/message');
});
}פרט אחד. בזמן שהעתיד החדש מתבצע, התצלום שומר את השגיאה האחרונה, כפי שהוא שומר נתונים ישנים: hasError נשאר true עד שהתשובה החדשה מגיעה. כדי להציג את מחוון הטעינה במהלך הניסיון השני, בודקים קודם את snapshot.connectionState:
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
// השגיאה והכפתור
}
return Text(snapshot.data!);כדי לראות את הכישלון בתצוגה המקדימה, כותבים offline = true; בשורה הראשונה של main ולוחצים על Run. הערך offline מגיע מ־api.dart: הוא גורם לכל קריאה להיכשל כאילו לא היה לטלפון קליטה. מסירים את השורה לפני שלוחצים על Check.
אתגר
בינוניתן למצב השגיאה דרך לצאת:
- מתחת לטקסט השגיאה, הוסף כפתור נסה שוב
- לחיצה עליו מגדירה
fetch('/message')חדש בתוךsetState - הספינר מוצג בזמן הניסיון החוזר: בדוק קודם את
ConnectionState.waitingבתוך הבונה
נסו בעצמכם
import 'package:flutter/material.dart';
import 'api.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: MessageScreen(),
);
}
}
class MessageScreen extends StatefulWidget {
const MessageScreen({super.key});
@override
State<MessageScreen> createState() => _MessageScreenState();
}
class _MessageScreenState extends State<MessageScreen> {
late Future<String> _message;
@override
void initState() {
super.initState();
_message = fetch('/message');
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FutureBuilder<String>(
future: _message,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(
'Could not load: ${snapshot.error}',
style: const TextStyle(fontSize: 20),
);
}
if (snapshot.hasData) {
return Text(snapshot.data!, style: const TextStyle(fontSize: 24));
}
return const CircularProgressIndicator();
},
),
),
);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה נתונים ורשת
תרגלו בעצמכם: קומפיילר Flutter אונליין