stdout.hasTerminal în Dart

hasTerminal spune dacă ieșirea merge într-un terminal; terminalColumns dă lățimea terminalului, în caractere.

Sintaxă
bool get hasTerminal
int get terminalColumns
int get terminalLines

Ce face stdout.hasTerminal

stdout.hasTerminal este true când programul scrie direct într-o fereastră de terminal și false când ieșirea este redirecționată într-un fișier (> raport.txt) sau într-un pipe. Un program poate folosi culori și animații doar în terminal și text simplu în rest.

stdout.terminalColumns și stdout.terminalLines dau numărul de coloane și de rânduri ale ferestrei. Ele funcționează doar când hasTerminal este true; altfel aruncă StdoutException.

Când rulezi exemplele de pe site, ieșirea este capturată, nu afișată într-un terminal, deci hasTerminal este false. Același program rulat direct în terminal afișează true.

Exemple

Exemplul 1: Unde merge ieșirea?

import 'dart:io';

void main() {
  print('Ieșire în terminal: ${stdout.hasTerminal}');
  try {
    print('Coloane: ${stdout.terminalColumns}');
  } on StdoutException catch (eroare) {
    print('Fără terminal: ${eroare.message}');
  }
}

Rezultat

Ieșire în terminal: false
Fără terminal: Could not get terminal size

Exemplul 2: Linie de separare cât lățimea ecranului

Fără terminal, programul folosește o lățime implicită de 30 de caractere.

import 'dart:io';

int latimeEcran() => stdout.hasTerminal ? stdout.terminalColumns : 30;

void main() {
  final latime = latimeEcran();
  print('=' * latime);
  print('Raport vânzări – Cluj'.padLeft((latime + 21) ~/ 2));
  print('=' * latime);
}

Rezultat

==============================
    Raport vânzări – Cluj
==============================

Exemplul 3: Același program, rulat în terminal

import 'dart:io';

void main() {
  print('Ieșire în terminal: ${stdout.hasTerminal}');
  if (stdout.hasTerminal) {
    print('Fereastra are ${stdout.terminalColumns} coloane și ${stdout.terminalLines} rânduri.');
  }
}

Rezultat posibil (depinde de mărimea ferestrei)

Ieșire în terminal: true
Fereastra are 120 coloane și 32 rânduri.

Greșeli frecvente

  • Citești terminalColumns fără să verifici hasTerminal: programul cade cu StdoutException când ieșirea este redirecționată sau rulează într-un CI.
  • Scrii coduri de culoare ANSI și când ieșirea merge într-un fișier: fișierul se umple de caractere ca \x1B[31m.

Comenzi înrudite

  • stdout: stdout este ieșirea standard a programului: tot ce apare în terminal; are metodele unui IOSink (write, writeln, writeAll).
  • stdin.echoMode: echoMode ascunde sau arată ce tastează utilizatorul (pentru parole); lineMode citește tastele imediat, fără să aștepte Enter.
  • stdout.write: stdout.write scrie text fără rând nou la final; stdout.writeln adaugă rândul nou, ca print.