Yeniden Dene Düğmesi
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 14 / 27.
Bağlantılar geri gelir. İyi bir hata ekranı kişiyi çaresiz bırakmaz: ne olduğunu söyler ve yeniden denemek için bir yol sunar.
Yeniden denemek, yeniden yüklemektir: tıpkı yenileme düğmesinde olduğu gibi, setState içinde yeni bir future oluşturun.
void tryAgain() {
setState(() {
_message = fetch('/message');
});
}Bir ayrıntı. Yeni future çalışırken snapshot, eski veriyi koruduğu gibi son hatayı da korur: yeni yanıt gelene kadar hasError değeri true kalır. İkinci deneme sırasında döndürücüyü göstermek için önce snapshot.connectionState değerini kontrol edin:
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
// hata ve düğme
}
return Text(snapshot.data!);Önizlemede hatayı görmek için main işlevinin ilk satırına offline = true; yazın ve Run düğmesine basın. offline, api.dart dosyasından gelir: telefonun sinyali yokmuş gibi her çağrının başarısız olmasını sağlar. Check düğmesine basmadan önce bu satırı kaldırın.
Görev
OrtaHata durumuna bir çıkış yolu ekle:
- hata metninin altına bir Try again düğmesi ekle
- bu düğmeye basıldığında
setStateiçinde yeni birfetch('/message')ayarla - yeniden denerken dönen simgesi görünür: oluşturucuda önce
ConnectionState.waitingdeğerini kontrol et
Kendin dene
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();
},
),
),
);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Veri ve Ağ bölümündeki tüm dersler
3Çağrılar Başarısız Olduğunda
try ile Hataları YakalamaHata Fırlatmafinally ile TemizlemeFutureBuilder Hata DurumuYeniden Dene DüğmesiKendi başına pratik yap: Online Flutter derleyicisi