Wczytaj dane ponownie przyciskiem
Część sekcji Dane i sieć ścieżki Flutter w Coddy. Lekcja 8 z 27.
Aby wczytać świeże dane, przekaż nowy future do FutureBuilder. Utwórz go w setState, aby ekran został ponownie zbudowany z jego użyciem:
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
setState(() {
_tip = fetch('/tip');
});
},
)Nowa podpowiedź pojawi się 2 sekundy później. Podczas wczytywania snapshot.hasData pozostaje true: builder zachowuje stare dane, aż zastąpią je nowe. Przy sprawdzaniu hasData stara podpowiedź pozostaje na ekranie i nic nie wskazuje, że aplikacja pracuje.
Aby ponownie wyświetlić wskaźnik ładowania, sprawdź snapshot.connectionState, czyli aktualny stan future. Ma on wartość ConnectionState.waiting, gdy future jest wykonywany, oraz ConnectionState.done, gdy jego wykonywanie się zakończy:
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
return Text(snapshot.data!);Gdy wykonywanie się zakończy, dane są dostępne, więc snapshot.data! jest bezpieczne.
Wyzwanie
ŚredniDodaj przycisk odświeżania, który wczytuje następną wskazówkę:
IconButtonzIcons.refreshwactionsgórnego paska- naciśnięcie go ustawia
_tipna nowefetch('/tip')wsetState - wskaźnik ładowania jest wyświetlany podczas wczytywania nowej wskazówki: sprawdź
snapshot.connectionState
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: TipScreen(),
);
}
}
class TipScreen extends StatefulWidget {
const TipScreen({super.key});
@override
State<TipScreen> createState() => _TipScreenState();
}
class _TipScreenState extends State<TipScreen> {
late Future<String> _tip;
@override
void initState() {
super.initState();
_tip = fetch('/tip');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Tip of the Day'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(24),
child: FutureBuilder<String>(
future: _tip,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
snapshot.data!,
textAlign: TextAlign.center,
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ć
2Ekrany ładowania
Wskaźnik ładowaniaPoznaj FutureBuilderPobierz raz w initStateWczytaj dane ponownie przyciskiemPociągnij, aby odświeżyć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