part și part of în Dart

Împarte o singură bibliotecă în mai multe fișiere, care își văd reciproc și numele private.

Sintaxă
// biblioteca.dart
part 'biblioteca_parte.dart';

// biblioteca_parte.dart
part of 'biblioteca.dart';

Ce face part și part of

Cu part, un fișier principal declară că alte fișiere fac parte din el, iar fiecare dintre acestea începe cu part of 'fisier_principal.dart';. Împreună formează o singură bibliotecă: numele private (cu _) sunt vizibile în toate părțile, iar importurile din fișierul principal sunt valabile și în părți. Versiunile noi de Dart permit și importuri proprii într-o parte; în cod mai vechi le vei găsi doar în fișierul principal.

Astăzi part se folosește mai ales pentru cod generat automat (de exemplu json_serializable sau freezed generează model.g.dart, inclus cu part 'model.g.dart';). Pentru împărțirea codului scris de mână, ghidul Dart recomandă biblioteci mici separate și export.

Un fișier part nu poate fi importat sau rulat singur. Exemplul are mai multe fișiere, așa că rezultatul este cel obținut rulând proiectul local.

Exemple

Exemplul 1: O bibliotecă în trei fișiere

Clasa privată _Elev este definită într-o parte și folosită în fișierul principal. main.dart importă doar catalog.dart.

// catalog.dart
library;

part 'catalog_elevi.dart';
part 'catalog_note.dart';

class Catalog {
  final _elevi = <_Elev>[];

  void adauga(String nume, List<int> note) => _elevi.add(_Elev(nume, note));

  void afiseaza() {
    for (final e in _elevi) {
      print('${e.nume}: ${mediaNotelor(e.note).toStringAsFixed(2)}');
    }
  }
}

// catalog_elevi.dart
part of 'catalog.dart';

class _Elev {
  final String nume;
  final List<int> note;
  _Elev(this.nume, this.note);
}

// catalog_note.dart
part of 'catalog.dart';

double mediaNotelor(List<int> note) => note.reduce((a, b) => a + b) / note.length;

// main.dart
import 'catalog.dart';

void main() {
  final c = Catalog()
    ..adauga('Ana', [10, 9, 9])
    ..adauga('Mihai', [7, 8]);
  c.afiseaza();
  print(mediaNotelor([5, 6]));
}

Rezultat (proiect cu mai multe fișiere)

Ana: 9.33
Mihai: 7.50
5.5

Greșeli frecvente

  • Să rulezi direct un fișier part of (dart run catalog_note.dart): o parte nu este o bibliotecă de sine stătătoare; rulezi sau imporți fișierul principal.
  • Calea din part of care nu corespunde fișierului principal: eroarea Expected this library to be part of '...', not '...'.
  • Folosirea lui part doar ca să ai acces la numele private din alt fișier: de cele mai multe ori o bibliotecă separată cu API public este mai clară.

Comenzi înrudite

  • library: Directiva de la începutul unui fișier Dart care marchează biblioteca, pentru documentație sau adnotări.
  • export: Face ca numele dintr-o altă bibliotecă să fie disponibile și celor care importă biblioteca curentă.
  • import: Face disponibile în fișierul curent numele publice ale altei biblioteci: din SDK, dintr-un pachet sau din proiect.