Tirer pour actualiser
Fait partie de la section Données et réseau du Journey Flutter de Coddy. Leçon 9 sur 27.
Sur un téléphone, on fait glisser une liste vers le bas pour l’actualiser. Un indicateur de chargement apparaît en haut, et les données sont mises à jour. Le widget Flutter correspondant est RefreshIndicator :
RefreshIndicator(
onRefresh: refresh,
child: ListView(
children: [ ... ],
),
)onRefresh est une fonction qui renvoie un Future. L’indicateur de chargement reste affiché jusqu’à ce que cette future soit terminée ; il faut donc await les nouvelles données à l’intérieur :
Future<void> refresh() async {
setState(() {
_tip = fetch('/tip');
});
await _tip;
}Le geste de glissement ne fonctionne que sur un élément défilable. Place le contenu dans un ListView, même s’il ne contient qu’un seul élément : un ListView peut toujours être tiré vers le bas. L’indicateur de chargement signale déjà que l’application travaille ; le constructeur peut donc conserver l’ancienne astuce avec une vérification de hasData.
Défi
MoyenFais recharger l’astuce lorsque tu fais glisser l’écran vers le bas :
- ajoute une méthode
refreshqui définit un nouveau_tipdanssetStateet l’attend - encapsule le corps dans un
RefreshIndicatoraveconRefresh: refresh - place le
FutureBuilderdans uneListViewà l’intérieur
Dans l’aperçu, fais glisser l’écran vers le bas avec la souris.
Essayez vous-même
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();
},
),
),
),
);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Données et réseau
2Écrans de chargement
Un indicateur pendant le chargementDécouvrir FutureBuilderCharger une seule fois dans initStateRecharger les données avec un boutonTirer pour actualiserEntraînez-vous par vous-même : Compilateur Flutter en ligne