stdin.readLineSync în Dart

Citește un rând de la tastatură (intrarea standard) și îl returnează fără Enter; returnează null la sfârșitul intrării.

Sintaxă
String? readLineSync({Encoding encoding = systemEncoding, bool retainNewlines = false})

Ce face stdin.readLineSync

stdin.readLineSync() oprește programul până când utilizatorul scrie un rând și apasă Enter, apoi returnează textul ca String, fără caracterul de rând nou. Este felul obișnuit de a citi date de la tastatură într-un program de consolă.

Tipul returnat este String?: când intrarea s-a terminat (Ctrl+D pe macOS/Linux, Ctrl+Z pe Windows, sau sfârșitul fișierului trimis cu <), returnează null. De aceea scrii de obicei stdin.readLineSync() ?? '' sau verifici null într-o buclă.

Textul citit este mereu un șir; pentru numere îl convertești cu int.tryParse sau double.tryParse. Pentru o întrebare pe același rând cu răspunsul, afișează textul cu stdout.write, nu cu print.

Parametri

Parametru Descriere
encoding Opțional. Codificarea textului; implicit codificarea sistemului (UTF-8 pe macOS și Linux).
retainNewlines Opțional. Dacă este true, păstrează caracterul de rând nou la final.

Ce returnează

Rândul citit, fără \n, sau null dacă nu mai există date de citit.

Exemple

Exemplul 1: Întrebare și răspuns

Textul scris de utilizator nu apare în rezultat, pentru că a fost trimis ca intrare; în terminal l-ai vedea după întrebare.

import 'dart:io';

void main() {
  stdout.write('Cum te cheamă? ');
  final nume = stdin.readLineSync() ?? '';
  stdout.write('Din ce oraș ești? ');
  final oras = stdin.readLineSync() ?? '';
  print('');
  print('Bună, $nume din $oras!');
}

Ce scrie utilizatorul (intrare)

Ana
Iași

Rezultat

Cum te cheamă? Din ce oraș ești? 
Bună, Ana din Iași!

Exemplul 2: Citirea unui număr cu verificare

int.tryParse returnează null pentru text care nu este număr, așa că programul cere din nou.

import 'dart:io';

void main() {
  int? varsta;
  while (varsta == null) {
    print('Câți ani ai?');
    final rand = stdin.readLineSync();
    if (rand == null) return;
    varsta = int.tryParse(rand.trim());
    if (varsta == null) print('„$rand” nu este un număr.');
  }
  print('Peste 10 ani vei avea ${varsta + 10} ani.');
}

Ce scrie utilizatorul (intrare)

douăzeci
20

Rezultat

Câți ani ai?
„douăzeci” nu este un număr.
Câți ani ai?
Peste 10 ani vei avea 30 ani.

Exemplul 3: Citire până la sfârșitul intrării

import 'dart:io';

void main() {
  final cumparaturi = <String>[];
  String? rand;
  while ((rand = stdin.readLineSync()) != null) {
    if (rand!.trim().isNotEmpty) cumparaturi.add(rand.trim());
  }
  print('Lista are ${cumparaturi.length} produse: ${cumparaturi.join(', ')}');
}

Ce scrie utilizatorul (intrare)

pâine
lapte

brânză

Rezultat

Lista are 3 produse: pâine, lapte, brânză

Greșeli frecvente

  • Folosești rezultatul direct ca String: tipul este String? și dart analyze dă eroare. Tratează null cu ?? sau cu o verificare.
  • Uiți trim(): pe Windows rândul poate păstra un \r, iar spațiile accidentale fac int.parse să eșueze.
  • Apelezi readLineSync într-o aplicație Flutter: acolo nu există consolă. Funcția este pentru programe de linie de comandă.

Comenzi înrudite

  • stdin: stdin este intrarea standard a programului: ce scrie utilizatorul la tastatură sau ce primește programul printr-un pipe.
  • stdout.write: stdout.write scrie text fără rând nou la final; stdout.writeln adaugă rândul nou, ca print.
  • stdin.echoMode: echoMode ascunde sau arată ce tastează utilizatorul (pentru parole); lineMode citește tastele imediat, fără să aștepte Enter.