stdin.echoMode în Dart

echoMode ascunde sau arată ce tastează utilizatorul (pentru parole); lineMode citește tastele imediat, fără să aștepte Enter.

Sintaxă
bool echoMode      // get și set
bool lineMode      // get și set
bool get hasTerminal

Ce face stdin.echoMode

Implicit, terminalul afișează fiecare tastă apăsată (echo) și trimite programului textul abia după Enter (mod rând). stdin.echoMode = false oprește afișarea, ca la introducerea unei parole. stdin.lineMode = false face ca fiecare tastă să ajungă imediat la program, util pentru meniuri cu o tastă sau jocuri în consolă.

Ambele setări schimbă terminalul și rămân active după ce programul se termină, dacă nu le restaurezi. De aceea le pui înapoi la true într-un bloc finally. Când dezactivezi ambele, dezactivează întâi echoMode, apoi lineMode.

Ele funcționează doar când intrarea este un terminal. Dacă intrarea vine dintr-un fișier sau pipe, citirea și setarea aruncă StdinException; verifică înainte stdin.hasTerminal.

Exemple

Exemplul 1: Citirea unei parole fără să se vadă

Funcția ascunde textul doar în terminal. Pe site intrarea vine din pipe, deci se citește direct, fără să se schimbe echoMode.

import 'dart:io';

String citesteParola(String intrebare) {
  stdout.write(intrebare);
  if (!stdin.hasTerminal) return stdin.readLineSync() ?? '';
  stdin.echoMode = false;
  try {
    return stdin.readLineSync() ?? '';
  } finally {
    stdin.echoMode = true;
    stdout.writeln();
  }
}

void main() {
  final parola = citesteParola('Parola: ');
  print('');
  print('Parola are ${parola.length} caractere.');
}

Ce scrie utilizatorul (intrare)

Brasov2026

Rezultat

Parola: 
Parola are 10 caractere.

Exemplul 2: Ce se întâmplă fără terminal

Intrarea exemplului nu este un terminal, așa că setarea aruncă StdinException.

import 'dart:io';

void main() {
  print('Terminal: ${stdin.hasTerminal}');
  try {
    stdin.echoMode = false;
  } on StdinException catch (eroare) {
    print('Nu pot schimba echoMode: ${eroare.message}');
  }
}

Rezultat

Terminal: false
Nu pot schimba echoMode: Error setting terminal echo mode

Exemplul 3: Meniu cu o singură tastă

Rulat în terminal, programul reacționează imediat la tastă, fără Enter. readByteSync returnează codul tastei.

import 'dart:io';

void main() {
  print('Alege: [a] adaugă  [s] șterge  [q] ieșire');
  stdin.echoMode = false;
  stdin.lineMode = false;
  try {
    final tasta = String.fromCharCode(stdin.readByteSync());
    switch (tasta) {
      case 'a':
        print('Ai ales: adaugă');
      case 's':
        print('Ai ales: șterge');
      default:
        print('La revedere!');
    }
  } finally {
    stdin.lineMode = true;
    stdin.echoMode = true;
  }
}

Rezultat în terminal, după apăsarea tastei a

Alege: [a] adaugă  [s] șterge  [q] ieșire
Ai ales: adaugă

Greșeli frecvente

  • Nu restaurezi echoMode la final (sau programul se oprește cu o excepție înainte): terminalul rămâne fără afișare și utilizatorul nu mai vede ce scrie. Folosește try/finally.
  • Setezi modurile fără să verifici stdin.hasTerminal: programul cade cu StdinException când primește datele dintr-un fișier sau dintr-un pipe.

Comenzi înrudite

  • stdin.readLineSync: Citește un rând de la tastatură (intrarea standard) și îl returnează fără Enter; returnează null la sfârșitul intrării.
  • stdin: stdin este intrarea standard a programului: ce scrie utilizatorul la tastatură sau ce primește programul printr-un pipe.
  • stdout.hasTerminal: hasTerminal spune dacă ieșirea merge într-un terminal; terminalColumns dă lățimea terminalului, în caractere.