Menu
CoddyTech

Um indicador giratório durante o carregamento

Parte da seção Dados e rede do Journey de Flutter da Coddy. Lição 5 de 27.

Dois segundos é muito tempo para ficar olhando para uma tela que não se move. Um círculo girando mostra à pessoa que o app está trabalhando nisso. No Flutter, ele é CircularProgressIndicator.

const CircularProgressIndicator()

Ele não precisa de nada para funcionar: coloque-o na tela e ele vai girar. A função dele é ser exibido apenas enquanto os dados estão a caminho. Um bool no seu estado faz isso:

bool loading = false;

// antes do await: loading = true
// depois do await: loading = false

loading ? const CircularProgressIndicator() : Text(message)

Defina loading como true em um setState antes de usar await e depois volte para false no setState que mostra a resposta.

challenge icon

Desafio

Fácil

Substitua o texto Loading... por um indicador de carregamento:

  • adicione bool loading = false; ao estado
  • defina-o como true antes de fetch e volte a defini-lo como false quando a mensagem chegar
  • enquanto loading for true, mostre um CircularProgressIndicator no lugar da mensagem

Experimente você mesmo

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')),
          ],
        ),
      ),
    );
  }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Dados e rede

Pratique por conta própria: Compilador de Flutter online