Sobes.tech
Junior

O que é o FutureBuilder no Flutter?

sobes.tech IA

Resposta da IA

Widget para construir interfaces com base em dados assíncronos obtidos de Future.

Parâmetros principais:

  • future: Uma instância de Future a ser observada.
  • initialData: Dados exibidos antes do future terminar.
  • builder: Função (AsyncWidgetBuilder) chamada a cada mudança de estado do future e que recebe BuildContext e AsyncSnapshot.

Estados de AsyncSnapshot:

  • ConnectionState.none: O Future ainda não começou.
  • ConnectionState.waiting: O Future está em execução.
  • ConnectionState.active: (Raro para Future) O Future retornou dados intermediários.
  • ConnectionState.done: O Future foi concluído (com sucesso ou erro).

Exemplo de uso:

// Suponha que temos uma função que retorna um Future<String>
Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2)); // Simulação de uma requisição de rede
  return "Dados carregados!";
}

// ... no método build do widget:
@override
Widget build(BuildContext context) {
  return FutureBuilder<String>(
    future: fetchData(), // Nosso Future
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      if (snapshot.connectionState == ConnectionState.waiting) {
        // Mostramos um indicador de carregamento enquanto o Future está em execução
        return CircularProgressIndicator();
      } else if (snapshot.hasError) {
        // Mostramos uma mensagem de erro se o Future terminou com erro
        return Text('Erro: ${snapshot.error}');
      } else {
        // Mostramos os dados se o Future foi concluído com sucesso
        return Text('Resultado: ${snapshot.data}');
      }
    },
  );
}

Vantagens:

  • Facilita o trabalho com operações assíncronas na UI.
  • Reconstrói automaticamente a UI ao mudar o estado do Future.
  • Divide claramente a lógica de carregamento de dados e a lógica de construção da UI.

Desvantagens:

  • Pode causar reconstruções desnecessárias se o Future for criado dentro do método build. Recomenda-se criar o Future uma única vez (por exemplo, no initState).