withContext(Dispatchers.IO) move a execução da corrotina para uma linha de execução de E/S, tornando nossa função de chamada muito segura e permitindo que a IU seja atualizada conforme necessário.
makeLoginRequest também é marcado com a palavra-chave suspend. Essa palavra-chave é a maneira do Kotlin impor uma função a ser chamada de dentro de uma corrotina.
Observação: para facilitar os testes, recomendamos injetar Dispatchers em uma camada Repository. Para saber mais, veja Testar corrotinas no Android (vídeo legendado).
No exemplo a seguir, a corrotina é criada no LoginViewModel. À medida que makeLoginRequest move a execução para fora da linha de execução principal, a corrotina na função login agora pode ser executada na linha de execução principal:
Observe que a corrotina ainda é necessária aqui, já que makeLoginRequest é uma função suspend, e todas as funções suspend precisam ser executadas em uma corrotina.
launch não usa um parâmetro Dispatchers.IO. Quando você não transmite um Dispatcher para launch, todas as corrotinas iniciadas em viewModelScope são executadas na linha de execução principal.
launch cria uma nova corrotina para fazer a solicitação de rede na linha de execução principal, e a corrotina inicia a execução.
Dentro da corrotina, a chamada para loginRepository.makeLoginRequest() agora suspende a execução futura da corrotina até que o bloco withContext em makeLoginRequest() seja concluído.
Quando o bloco withContext termina, a corrotina em login() retoma a execução na linha de execução principal com o resultado da solicitação de rede.
Observação: para se comunicar com o View da camada ViewModel, use LiveData conforme recomendado no Guia para a arquitetura do app. Ao seguir esse padrão, o código no ViewModel é executado na linha de execução principal, para que você possa chamar a função setValue() do MutableLiveData diretamente.
Para processar exceções que a camada Repository pode gerar, use o suporte integrado para exceções do Kotlin (link em inglês). No exemplo a seguir, usamos um bloco try-catch:
Neste exemplo, qualquer exceção inesperada gerada pela chamada makeLoginRequest() é tratada como um erro na IU.
Para ter uma visão mais detalhada das corrotinas no Android, consulte Melhorar o desempenho do app com corrotinas de Kotlin.

O projeto de lei nº1/2021, de autoria do vereador Marcos Paulo (PSOL), obriga os condomínios residenciais e comerciais a comunicar às autoridades policiais a ocorrência de casos de maus-tratos aos animais domésticos e da fauna silvestres ou exóticos em suas unidades condominiais ou nas áreas comuns. A medida foi publicada nesta segunda (22) no Diário Oficial.
Com o objetivo de facilitar a constatação da ocorrência e aplicar medidas cabíveis, o projeto prevê informações completas, a exemplo de identificação e contato dos tutores; qualificação do animal, com informe da espécie, raça ou características físicas que permitam a sua identificação; endereço onde o animal e os tutores podem ser localizados; detalhamento sobre a ocorrência de maus-tratos.
Segundo o político, a justificativa para a medida é a relevância do tema, já tutelado por leis. No entanto, de acordo com ele, apesar da existência de penalidades legais, o índice de maus-tratos aos animais tem aumentado. O projeto de lei ainda passará por votação na Câmara de Vereadores.

Sejam livres de fazerem o que quiserem, desde que não acabem com a liberdade do próximo. With great power, comes great responsability! (Nah, isto já não tem muito a ver; eu é que estou a ver o The Amazing Spider-Man).
A grande Kugimiya Rie! Também faz o Happy (Fairy Tail), a Nemu e a Karin (Bleach) e ainda me lembro da Taiga (Toradora).
Já agora também gosto do actor que dá voz à personagem Yuuko Aito, que também faz o Sora (No Game No Life) e fez o Kirito no SAO.