2
respostas

[Dúvida] Código não avança após primeiro input no terminal

Em tese, este código deveria funcionar, mas toda vez que chega na parte de adicionar notas, ele não avança para o próximo passo no terminal, começa até a sobrescrever o que está no terminal. Os outros dois comandos funcionam normalmente.

import 'dart:io';
import 'package:cli_dialog/cli_dialog.dart';

void main() {
  List<int> notas = <int>[];

  while (true) {
    var comando = getComando();

    if (comando == 'Sair') {
      print('Até logo!');
      break;
    }

    if (comando == 'Adicionar nota') {
      adicionarNota(notas);
    } else if (comando == 'Listar notas') {
      listarNotas(notas);
    }
  }
}

dynamic getComando() {
  const comandos = [
    [
      {
        'question': 'Escolha um comando: ',
        'options': ['Adicionar nota', 'Listar notas', 'Sair'],
      },
      'comando',
    ],
  ];

  final dialogo = CLI_Dialog(listQuestions: comandos);
  final resposta = dialogo.ask();
  final comando = resposta['comando'];

  return comando;
}

List<int> adicionarNota(List<int> notas) {
  while (true) {
    stdout.write('Digite a sua nota (de 0 a 10): ');
    int nota = int.tryParse(stdin.readLineSync() ?? '') ?? -1;

    if (nota < 0 || nota > 10) {
      print('Valor inválido! Tente novamente!');
    } else {
      notas.add(nota);
      return notas;
    }
  }
}

void listarNotas(List<int> notas) {
  if (notas.isEmpty) {
    print('Nenhuma nota cadastrada.');
    return;
  }

  int i = 1;

  for (int nota in notas) {
    print('Nota $i: $nota');
    i++;
  }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguém saberia me dizer o porquê e como ajustar?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas

A mesma coisa acontece com este outro código, que roda normalmente no Android Studio, mas não avança no terminal:

import 'dart:io';
import 'package:tabular/tabular.dart';

class Conta {
  double saldo;

  Conta(this.saldo);
}

void main() {
  Map<int, Function> operacoes = {
    1: depositar,
    2: sacar,
    3: transferir,
    4: pagar,
    5: consultarSaldo
  };

  Conta conta = Conta(1000.00);

  print('Seu saldo atual é: R\$${conta.saldo}');

  while (true) {
    int operacao = obterOperacao();

    if (operacao == 6) {
      print('Até logo!');
      return;
    }

    if (operacoes.containsKey(operacao)) {
      operacoes[operacao]!(conta);
    } else {
      print('Operação inválida! Tente novamente.');
    }
  }
}

int obterOperacao() {
  var data = [
    ['#', 'Operação'],
    [1, 'Depositar'],
    [2, 'Sacar'],
    [3, 'Transferir'],
    [4, 'Pagar'],
    [5, 'Consultar'],
    [6, 'Sair']
  ];
  var tabela = tabular(data);
  print(tabela);

  stdout.write('Escolha a sua operação: ');
  int operacao = int.tryParse(stdin.readLineSync() ?? '') ?? 0;
  return operacao;
}

double depositar(Conta conta) {
  stdout.write('Informe o valor para depósito: ');
  double deposito = double.tryParse(stdin.readLineSync() ?? '') ?? 0;

  if (deposito < 1) {
    print('Valor inválido! Por favor, informe um valor maior que zero');
    return depositar(conta);
  }

  print('Operação escolhida: deposito; Valor: $deposito');
  return conta.saldo += deposito;
}

double sacar(Conta conta) {
  stdout.write('Informe o valor para saque: ');
  double saque = double.tryParse(stdin.readLineSync() ?? '') ?? 0;

  if (saque < 1) {
    print('Valor inválido! Por favor, informe um valor maior que zero');
    return sacar(conta);
  } else if (saque > conta.saldo) {
    print('Saldo insuficiente!');
    return 0;
  }

  print('Operação escolhida: saque; Valor: $saque');
  return conta.saldo -= saque;
}

double transferir(Conta conta) {
  stdout.write('Informe o valor para transferência: ');
  double transferencia = double.tryParse(stdin.readLineSync() ?? '') ?? 0;

  if (transferencia < 1) {
    print('Valor inválido! Por favor, informe um valor maior que zero');
    return transferir(conta);
  } else if (transferencia > conta.saldo) {
    print('Saldo insuficiente!');
    return 0;
  }

  print('Operação escolhida: transferência; Valor: $transferencia');
  return conta.saldo -= transferencia;
}

double pagar(Conta conta) {
  stdout.write('Informe o valor para transferência: ');
  double pagamento = double.tryParse(stdin.readLineSync() ?? '') ?? 0;

  if (pagamento < 1) {
    print('Valor inválido! Por favor, informe um valor maior que zero');
    return pagar(conta);
  } else if (pagamento > conta.saldo) {
    print('Saldo insuficiente!');
    return 0;
  }

  print('Operação escolhida: pagamento; Valor: $pagamento');
  return conta.saldo -= pagamento;
}

void consultarSaldo(Conta conta) {
  print('Seu saldo atual é: R\$${conta.saldo}');
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como deveria rodar:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O cli_dialog e o stdin.readLineSync() não se dão muito bem...

O cli_dialog usa uns truques de terminal (ANSI codes) pra deixar o menu bonitinho, tipo movimentar o cursor, limpar linhas, etc.
Só que quando tu volta pro stdin.readLineSync(), ele não entende mais onde o cursor tá — aí o terminal começa a bugar, sobrescrever texto, parecer travado… tudo isso é sintoma clássico dessa mistura.

Tente usar só o cli_dialog:

 import 'package:cli_dialog/cli_dialog.dart';

void main() {
  List<int> notas = [];

  while (true) {
    final comando = getComando();

    if (comando == 'Sair') {
      print('Até logo!');
      break;
    } else if (comando == 'Adicionar nota') {
      adicionarNota(notas);
    } else if (comando == 'Listar notas') {
      listarNotas(notas);
    }
  }
}

dynamic getComando() {
  const comandos = [
    [
      {
        'question': 'Escolha um comando:',
        'options': ['Adicionar nota', 'Listar notas', 'Sair'],
      },
      'comando'
    ]
  ];

  final dialogo = CLI_Dialog(listQuestions: comandos);
  final resposta = dialogo.ask();
  return resposta['comando'];
}

void adicionarNota(List<int> notas) {
  const pergunta = [
    [
      {'question': 'Digite sua nota (0 a 10):'},
      'nota'
    ]
  ];

  final dialogo = CLI_Dialog(listQuestions: pergunta);
  final resposta = dialogo.ask();
  final nota = int.tryParse(resposta['nota'] ?? '') ?? -1;

  if (nota < 0 || nota > 10) {
    print('Valor inválido! Tenta de novo.');
  } else {
    notas.add(nota);
    print('Nota adicionada!');
  }
}

void listarNotas(List<int> notas) {
  if (notas.isEmpty) {
    print('Nenhuma nota cadastrada.');
    return;
  }

  for (var i = 0; i < notas.length; i++) {
    print('Nota ${i + 1}: ${notas[i]}');
  }
}