Przycisk „Spróbuj ponownie”
Część sekcji Dane i sieć ścieżki Flutter w Coddy. Lekcja 14 z 27.
Połączenie zostaje przywrócone. Dobry ekran błędu nie pozostawia użytkownika bez wyjścia: informuje, co się stało, i umożliwia ponowną próbę.
Ponowna próba to przeładowanie: utwórz nową wartość future w setState, tak jak robi to przycisk odświeżania.
void tryAgain() {
setState(() {
_message = fetch('/message');
});
}Jeden szczegół. Gdy działa nowe future, snapshot zachowuje ostatni błąd, tak jak zachowuje stare dane: hasError pozostaje true, dopóki nie pojawi się nowa odpowiedź. Aby podczas drugiej próby wyświetlić spinner, najpierw sprawdź snapshot.connectionState:
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
// błąd i przycisk
}
return Text(snapshot.data!);Aby zobaczyć błąd w podglądzie, wpisz offline = true; jako pierwszą linię w main i naciśnij Run. offline pochodzi z api.dart: sprawia, że każde wywołanie kończy się błędem, jak gdyby telefon nie miał zasięgu. Usuń tę linię, zanim naciśniesz Check.
Wyzwanie
ŚredniZapewnij możliwość wyjścia ze stanu błędu:
- pod tekstem błędu dodaj przycisk Spróbuj ponownie
- naciśnięcie go ustawia nowe
fetch('/message')wsetState - podczas ponownej próby wyświetla się wskaźnik ładowania: najpierw sprawdź
ConnectionState.waitingw builderze
Spróbuj swoich sił
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();
},
),
),
);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Dane i sieć
3Gdy wywołania kończą się niepowodzeniem
Przechwytywanie błędów za pomocą tryZgłaszanie błęduSprzątanie za pomocą finallyStan błędu w FutureBuilderPrzycisk „Spróbuj ponownie”Poćwicz samodzielnie: Kompilator Flutter online