Индикатор во время загрузки
Часть раздела Данные и сеть путешествия по Flutter на Coddy. Урок 5 из 27.
Две секунды — это долго, если смотреть на неподвижный экран. Вращающийся круг показывает пользователю, что приложение выполняет работу. Во Flutter это CircularProgressIndicator.
const CircularProgressIndicator()Для работы ему ничего не нужно: поместите его на экран, и он начнёт вращаться. Его задача — показываться только до тех пор, пока загружаются данные. Для этого в состоянии используется bool:
bool loading = false;
// до await: loading = true
// после await: loading = false
loading ? const CircularProgressIndicator() : Text(message)Установите loading в значение true внутри setState перед await, а затем верните значение false внутри setState, который показывает ответ.
Задание
ЛегкоЗамени текст Loading... на индикатор загрузки:
- добавь
bool loading = false;в состояние - установи для него значение
trueперед вызовомfetch, а когда сообщение придёт — верни значениеfalse - пока
loadingимеет значение true, показывайCircularProgressIndicatorвместо сообщения
Попробуйте сами
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> {
String message = 'No message yet';
Future<void> loadMessage() async {
setState(() {
message = 'Loading...';
});
final text = await fetch('/message');
setState(() {
message = text;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(message, style: const TextStyle(fontSize: 24)),
const SizedBox(height: 24),
ElevatedButton(onPressed: loadMessage, child: const Text('Load message')),
],
),
),
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Данные и сеть
1Future (асинхронные результаты)
Значение, которое появится позжеОжидание с async и awaitФункции, возвращающие FutureПрактический API Coddy2Экраны загрузки
Индикатор во время загрузкиЗнакомство с FutureBuilderЗагрузка данных один раз в initStateПерезагрузка данных кнопкойОбновление свайпом вниз3Когда вызовы завершаются ошибкой
Перехват ошибок с помощью tryВыбрасывание ошибкиОчистка с помощью finallyСостояние ошибки в FutureBuilderКнопка «Попробовать снова»Потренируйтесь самостоятельно: Онлайн-компилятор Flutter