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 ofcare nu corespunde fișierului principal: eroareaExpected this library to be part of '...', not '...'. - Folosirea lui
partdoar 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.