Oi Charles,
Seu código está quase perfeito! 👍
A recursão na função escolhaDoMetodoDePagamento funciona, mas pode causar um estouro de pilha se o usuário errar muitas vezes. Uma alternativa seria usar um loop while para manter a solicitação até que uma opção válida seja fornecida.
Além disso, você pode usar um do...while para garantir que a pergunta seja feita pelo menos uma vez. Veja um exemplo:
void escolhaDoMetodoDePagamento() {
  String? opcao;
  do {
    print('Digite o método de Pagamento: ${metodoDePagamento.join(', ')}');
    opcao = stdin.readLineSync();
  } while (opcao == null || opcao.isEmpty || !metodoDePagamento.contains(opcao));
  opcaoDePagamento = opcao;
  metodosDePagamentos(opcaoDePagamento);
}
Essa abordagem evita a recursão e torna o código mais robusto. 💪
Para saber mais: Documentação oficial do Dart sobre loops.
Continue praticando e explorando as possibilidades! 💻