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
echoModela 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ștetry/finally. - Setezi modurile fără să verifici
stdin.hasTerminal: programul cade cuStdinExceptioncâ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.