Pociągnij, aby odświeżyć
Część sekcji Dane i sieć ścieżki Flutter w Coddy. Lekcja 9 z 27.
Na telefonie użytkownicy przeciągają listę w dół, aby ją odświeżyć. U góry pojawia się wskaźnik ładowania, a dane są aktualizowane. Widget Fluttera, który to umożliwia, to RefreshIndicator:
RefreshIndicator(
onRefresh: refresh,
child: ListView(
children: [ ... ],
),
)onRefresh to funkcja, która zwraca wartość typu Future. Wskaźnik ładowania pozostaje widoczny, dopóki ta przyszła wartość nie zostanie obliczona, więc użyj await dla nowych danych wewnątrz tej funkcji:
Future<void> refresh() async {
setState(() {
_tip = fetch('/tip');
});
await _tip;
}Przeciąganie działa tylko na elemencie, który można przewijać. Umieść zawartość w ListView, nawet jeśli zawiera tylko jeden element: ListView zawsze można przeciągnąć. Wskaźnik ładowania informuje już, że aplikacja pracuje, więc builder może zachować poprzednią podpowiedź, używając warunku hasData.
Wyzwanie
ŚredniSpraw, aby wskazówka odświeżała się po przeciągnięciu ekranu w dół:
- dodaj metodę
refresh, która ustawia nową wartość_tipwsetStatei czeka na jej zakończenie - otocz treść elementem
RefreshIndicatorzonRefresh: refresh - umieść
FutureBuilderw elemencieListViewwewnątrz niego
W podglądzie przeciągnij ekran w dół za pomocą myszy.
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