As abordagens async e await no Dart são muito semelhantes às de outras linguagens, o que o torna um tópico confortável de entender para aqueles que já usaram esse padrão antes. No entanto, mesmo se você não tiver experiência com programação assíncrona usando async / await, deve ser fácil acompanhar aqui. 

Funções assíncronas:

As funções formam a base da programação assíncrona. Essas funções assíncronas têm modificadores assíncronos em seu corpo. Aqui está um exemplo de uma função assíncrona geral abaixo:

Quando uma função assíncrona é chamada, um Future é imediatamente retornado e o corpo da função é executado posteriormente. Conforme o corpo da função assíncrona é executado, o Future retornado pela chamada de função será concluído junto com seu resultado. No exemplo acima, chamar demo() resulta no Future. 

Todas as funções que você deseja executar de forma assíncrona precisam ter o modificador assíncrono adicionado a ela. Este modificador vem logo após a assinatura da função, assim:

void hello() async {
  print('something exciting is going to happen here...');
}

Normalmente, a função que você deseja executar de forma assíncrona teria alguma operação cara, como E / S de arquivo (uma chamada de API para um serviço RESTful).

Esperar expressões:

Expressões de espera faz você escrever o código assíncrono quase como se fosse síncrono. Em geral, uma expressão de espera tem a forma fornecida a seguir:

void main() async {
  await hello();
  print('all done');
}

Normalmente, é um cálculo assíncrono e espera-se que avalie para um futuro. As expressões await avaliam a função principal e, em seguida, suspende a função atualmente em execução até que o resultado esteja pronto - ou seja, até que o Future seja concluído. O resultado da expressão await é a conclusão do Futuro.

  • duas coisas importantes a entender sobre o bloco de código acima. Primeiro, usamos o modificador assíncrono no método principal porque vamos executar a função hello() de forma assíncrona.
  • Em segundo lugar, colocamos o modificador await diretamente na frente de nossa função assíncrona. Portanto, isso é freqüentemente referido como padrão assíncrono / espera.
  • Apenas lembre-se, se você for usar await, certifique-se de que a função do chamador e todas as funções que você chamar dentro dessa função usem o modificador assíncrono .

Futuros:

Dart é uma linguagem de programação de thread único. O objeto Future <T> representa o resultado de uma operação assíncrona que produz um resultado do tipo T. Se o resultado não for um valor utilizável, o tipo do futuro será Future <void>. Um futuro representa um único valor de dados ou erro de forma assíncrona

Existem 2 maneiras de lidar com futuros:

  • Usando a API do Futuro
  • Usando a operação assíncrona e espera.

Agora, vamos escrever um programa e ver o resultado.

Exemplo:

Future delayedPrint(int seconds, String msg) {
  final duration = Duration(seconds: seconds);
  return Future.delayed(duration).then((value) => msg);
}
main() async {
  print('Life');
  await delayedPrint(2, "Is").then((status){
    print(status);
  });
  print('Good');
}

Saída-

Life
Is
Good

Nesse caso, usamos as palavras-chave async e await. O Await basicamente mantém o fluxo de controle, até que a operação seja concluída. Para usar o await dentro de uma função, temos que marcar a função por palavra-chave async. O que significa que esta função é uma função assíncrona.

Combinado com a classe Futures, o padrão async / await no Dart é uma maneira poderosa e expressiva de fazer programação assíncrona.