1
resposta

Timer atualizar página

Bom tarde, estou utilizando o código abaixo para consultar uma api e verificar se tem novos registros: Existe alguma maneira de atualizar apenas o Widget que exibe essa lista de pedidos sem que toda página seja renderizada novamente?

@override
  void initState() {    
    super.initState();
    Timer timer = Timer.periodic(duration, (Timer t) {
      atualizaPedidosAplicativo();
    });
  }


  atualizaPedidosAplicativo() async {
    List<PedidoDto> listaDePedidos = await PedidoService().aguardandoConfirmacao();
    setState(() {
      this.pedidos = listaDePedidos;
    });
  }
1 resposta

Olá Marco, tudo bem?

Sim, é possível atualizar apenas o Widget que exibe a lista de pedidos sem que toda a página seja renderizada novamente. Para isso, você pode utilizar o widget StreamBuilder.

O StreamBuilder é um widget que permite construir widgets de forma reativa, ou seja, ele é reconstruído automaticamente sempre que os dados que ele está observando são atualizados.

Você pode criar um Stream que emite a lista de pedidos atualizada e utilizá-lo no StreamBuilder para construir a lista de pedidos. Dessa forma, apenas o StreamBuilder será reconstruído quando houver uma atualização na lista de pedidos.

Aqui está um exemplo de como utilizar o StreamBuilder no seu código:

Stream<List<PedidoDto>> _pedidosStream;

@override
void initState() {    
  super.initState();
  _pedidosStream = Stream.periodic(duration).asyncMap((_) => PedidoService().aguardandoConfirmacao());
}

@override
Widget build(BuildContext context) {
  return StreamBuilder<List<PedidoDto>>(
    stream: _pedidosStream,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return ListView.builder(
          itemCount: snapshot.data.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(snapshot.data[index].nome),
              subtitle: Text(snapshot.data[index].descricao),
            );
          },
        );
      } else if (snapshot.hasError) {
        return Text('Erro ao carregar lista de pedidos');
      } else {
        return CircularProgressIndicator();
      }
    },
  );
}

Nesse exemplo, o StreamBuilder está observando o Stream _pedidosStream, que é atualizado periodicamente com a lista de pedidos atualizada. Quando o StreamBuilder é reconstruído, ele verifica se há dados no snapshot e, se houver, constrói a lista de pedidos. Se houver um erro, exibe uma mensagem de erro e, se não houver dados ainda, exibe um indicador de progresso.

Espero ter ajudado e bons estudos!