UnmodifiableListView în Dart

O vedere doar pentru citire peste o listă: nu poate fi modificată, dar arată schimbările din lista originală.

Sintaxă
import 'dart:collection';

class UnmodifiableListView<E> extends UnmodifiableListBase<E>
UnmodifiableListView(Iterable<E> source)

Ce face UnmodifiableListView

UnmodifiableListView(lista) nu copiază elementele, ci învelește lista originală. Prin vedere poți citi ([i], length, for-in), dar orice încercare de modificare aruncă UnsupportedError.

Pentru că nu este o copie, schimbările făcute în lista originală se văd imediat prin vedere. Este modul obișnuit de a expune o listă internă a unei clase fără ca restul codului să o poată schimba.

Diferența față de List.unmodifiable: aceea face o copie (nu mai vede schimbările ulterioare); vederea nu copiază nimic.

Parametri

Parametru Descriere
source Lista (sau iterable-ul) învelită.

Ce returnează

O listă nemodificabilă legată de sursă.

Exemple

Exemplul 1: Lista internă a unei clase

import 'dart:collection';

class Catalog {
  final _elevi = <String>[];
  UnmodifiableListView<String> get elevi => UnmodifiableListView(_elevi);
  void inscrie(String nume) => _elevi.add(nume);
}

void main() {
  final c = Catalog();
  final vedere = c.elevi;
  c.inscrie('Ana');
  c.inscrie('Mihai');
  print('Vederea vede: $vedere, lungime ${vedere.length}');
  try {
    vedere.add('Hacker');
  } on UnsupportedError catch (e) {
    print('Nu se poate: ${e.message}');
  }
}

Rezultat

Vederea vede: [Ana, Mihai], lungime 2
Nu se poate: Cannot add to an unmodifiable list

Exemplul 2: Vedere față de copie nemodificabilă

import 'dart:collection';

void main() {
  final orase = ['Iași', 'Cluj'];
  final vedere = UnmodifiableListView(orase);
  final copie = List.unmodifiable(orase);
  orase.add('Sibiu');
  print('vedere: $vedere');
  print('copie:  $copie');
}

Rezultat

vedere: [Iași, Cluj, Sibiu]
copie:  [Iași, Cluj]

Greșeli frecvente

  • Crezi că vederea „îngheață” datele. Lista originală poate fi schimbată în continuare, iar vederea arată schimbările; pentru o fotografie fixă folosește List.unmodifiable.

Comenzi înrudite

  • List.empty: List.empty creează o listă goală; List.unmodifiable creează o copie care nu mai poate fi schimbată.
  • Map.of: Map.of face o copie modificabilă a unui map; Map.unmodifiable face o copie care nu mai poate fi schimbată.
  • List: Lista din Dart: elemente în ordine, accesate după poziție, care poate crește sau scădea.