1
resposta

print sem pular linha e com delay no Dart [RESOLVIDO]

Para atender esse requesito será utilizado a sincronização do Future em detrimento do sleep. Com sleep não é possível printar sequencialmente na tela, não com o método write do stdout.

import 'dart:io';

void main() {
  stdout.write('Simulating loading.');//stdout.write = print sem newline
  Future.delayed(Duration(seconds: 1), () {
    stdout.write(".");
  } );

  Future.delayed(Duration(seconds: 2), () {
    print(".");
  } );

  ///Todo e qualquer código que deverá ser executado após a sequência de códigos ácima devem ser inseridos
  ///no bloco Future abaixo [que será executado após o segundo 3]:
  Future.delayed(Duration(seconds: 3), () {
    print('{Continue}');
  } );

}

Output:

Simulating loading...
{Continue}

OBS: entre os pontos há um intervalo de 1 segundo para serem inserídos na tela, simulando o efeito como se tivesse aguardando um processamento interno.

1 resposta

Ai você me pergunta pq não utlizar um simples sleep(Duration (seconds: 1)) que criar também um delay também na execução do programa?

Isso até séria uma ideia plausível se você estivesse usando a função com um print normal (que pula linha). Porém, nesse caso, quando há uma execução simultânea com o stdout.write, eles não são executados sequencialmente.

Exemplo para ilustrar a divergência à e esse comportamento inesperado:

void main() {
        stdout.write('Simulando carregamento');
        sleep(Duration (seconds: 1));
        stdout.write('.');
        sleep(Duration (seconds: 1));
        stdout.write('.');
        sleep(Duration (seconds: 1));
        print('.');
}

Resultado:

vai ser impresso no console

Simulando carregamento...

de acordo com o que foi programado, entretanto, o tempo de espera que deveria ser de 1 segundo para exibir o caracter (ponto), e esperar novamente o tempo definido não obdecerá esta ordem cronológica. Mas antes, o tempo total será aguardado, e posteriormente o a msg será impressa no console de uma só única vez .