Nesse primeiro arquivo, para uma melhor organização, separei as mensagens em lista.
msgs.dart
List<Map<String, dynamic>> cv01 = [
{'user': 'João', 'msg': 'Bom dia, Mariana!'},
{'user': 'Mariana', 'msg': 'Bom dia! Tudo bem?'},
{'user': 'João','msg': 'Suave, e vc?'},
{'user': 'Mariana','msg': 'Certinho.'},
{'user': 'João','msg': 'Vamos iniciar nossa call? Temos muitas coisas para planejar.'},
{'user': 'Mariana','msg': 'Realmente, vamos lá, João.'},
];
Já no arquivo principal, o Future é utilizado para esperar o fim da simulação, informando-o com o .then. Enquanto isso, cada mensagem é lida da lista do arquivo "msgs.dart", printando nome do usuário e sua mensagem. Try, catch, finally bem simples, onde o finally indica o enceramento da conversa. Ainda, simulei de maneira bem simples o tempo de leitura e digitação dos usuários entre os prints de cada mensagem com o async/await e Future.delayed, onde o tempo depende do tamanho de cada mensagem.
desafio.dart
import 'msgs.dart';
void main() async {
String msg;
String user;
Future endSimulation = Future(() async {
try {
for (var item in cv01) {
user = '${item['user']}';
msg = '${item['msg']}';
await processing(msg);
conversation(user, msg);
}
} catch (e) {
print(e);
} finally {
print('-- Encerrando conversa --');
}
return '-- Simulação encerrada --';
}).then((value) => print('$value'));
}
// Calcula o tempo a ser utilizado na função "processing".
int funcDuration(String msg) => msg.length * 300;
// Simula o tempo de leitura e digitação do usuário, de maneira bem simples.
processing(String msg) async {
return await Future.delayed(Duration(milliseconds: funcDuration(msg)));
}
// Printa o nome do usuário e sua mensagem.
conversation(String user, String msg) {
print('$user: ' + msg);
}
SAIDA:
João: Bom dia, Mariana!
Mariana: Bom dia! Tudo bem?
João: Suave, e vc?
Mariana: Certinho.
João: Vamos iniciar nossa call? Temos muitas coisas para planejar.
Mariana: Realmente, vamos lá, João.
-- Encerrando conversa --
-- Simulação encerrada --