Dart — γλώσσα προγραμματισμού από την Google, που δημιουργήθηκε ειδικά για το cross-platform πλαίσιο Flutter. Συνδυάζει μεταγλώττιση JIT για αστραπιαία hot reload και μεταγλώττιση AOT για εγγενή απόδοση σε εκδόσεις release. Η Dart χρησιμοποιείται όχι μόνο στην ανάπτυξη εφαρμογών για κινητά, αλλά και για διαδικτυακές εφαρμογές (AngularDart) και λύσεις διακομιστή. Διαβάστε περισσότερα σχετικά με τις δυνατότητες της γλώσσας στην επίσημη τεκμηρίωση της Dart.
Κύρια σημεία
Dart — γλώσσα προγραμματισμού με σύνταξη παρόμοια με C, που αναπτύχθηκε από την Google υπό την ηγεσία του Lars Bak (δημιουργού του Eclipse). Η πρώτη έκδοση κυκλοφόρησε το 2011, αλλά η πραγματική δημοτικότητα της Dart ήρθε το 2018 με την κυκλοφορία του Flutter 1.0. Η γλώσσα σχεδιάστηκε για τη δημιουργία διεπαφών χρήστη: διαθέτει ενσωματωμένη υποστήριξη για streams, futures και reactive μοτίβα.
Η φιλοσοφία της Dart — "ισορροπία απόδοσης και παραγωγικότητας". Η γλώσσα υποστηρίζει δύο στρατηγικές μεταγλώττισης: JIT (Just-In-Time) για ανάπτυξη με hot reload και AOT (Ahead-Of-Time) για εκδόσεις release με εγγενή απόδοση. Ο μεταγλωττιστής JIT εισάγει τον τροποποιημένο κώδικα στην εκτελούμενη εφαρμογή σε χιλιοστά του δευτερολέπτου, χωρίς να απαιτεί εκ νέου μεταγλώττιση του APK — αυτό είναι το βασικό πλεονέκτημα της Dart έναντι άλλων γλωσσών στο πλαίσιο της ανάπτυξης για κινητά.
Το βασικό χαρακτηριστικό της Dart — sound null safety, που εισήχθη στην Dart 2.12 (2021). Το σύστημα τύπων εγγυάται ότι μια μεταβλητή δεν μπορεί να είναι null χωρίς ρητή ένδειξη (int?). Αυτό εξαλείφει το NullPointerException στο στάδιο της μεταγλώττισης. Σύμφωνα με στοιχεία της Google, η εφαρμογή του null safety μείωσε τον αριθμό των crash σε εφαρμογές Flutter κατά 30% στο περιβάλλον παραγωγής.
Το οικοσύστημα Dart περιλαμβάνει τρεις βασικές κατευθύνσεις: Flutter (εφαρμογές για κινητά και επιτραπέζιους υπολογιστές), AngularDart (διαδικτυακές εφαρμογές) και Dart Server (λύσεις διακομιστή). Flutter — η κυρίαρχη πλατφόρμα: σύμφωνα με τη Statista (2025), το Flutter χρησιμοποιείται στο 46% των cross-platform έργων για κινητά, ξεπερνώντας το React Native (38%) και το Xamarin (8%).
Η σύνταξη της Dart θυμίζει Java και JavaScript, αλλά έχει τις δικές της μοναδικές κατασκευές. Τα πάντα στη Dart είναι αντικείμενο — ακόμη και οι int, double και bool κληρονομούν από το Object. Η τυποποίηση είναι προαιρετική: μια μεταβλητή που δηλώνεται ως var εξάγει αυτόματα τον τύπο, αλλά συνιστάται η ρητή αναγραφή των τύπων για αναγνωσιμότητα και απόδοση.
Η Dart υποστηρίζει int, double, String, bool, List, Set, Map, Record, Symbol και Runes. Τύπος Nullable — οποιοσδήποτε τύπος με επίθημα ? (int?, String?). Ο τελεστής ?? (null-aware) επιστρέφει την τιμή στα δεξιά αν η αριστερή είναι null. Ο συμβολισμός αλυσίδας (..) επιτρέπει την κλήση πολλαπλών μεθόδων στο ίδιο αντικείμενο χωρίς επανάληψη της αναφοράς.
// Βασικοί τύποι και δηλώσεις στη Dart
void main() {
// Ρητή τυποποίηση
int age = 25;
double price = 19.99;
String name = 'Dart';
bool isValid = true;
// Null safety — η μεταβλητή μπορεί να είναι null
int? nullableAge = null;
int result = nullableAge ?? 0; // Τελεστής null-aware
// Συλλογές με generics
List<String> items = ['Dart', 'Flutter', 'Mobile'];
Map<String, dynamic> config = {
'version': '3.0',
'mode': 'debug',
};
// Συμβολισμός αλυσίδας
final list = <String>[]
..add('one')
..add('two')
..sort();
}
// Record — ανώνυμος αμετάβλητος τύπος
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'Ο τύπος dynamic απενεργοποιεί τον έλεγχο τύπων — χρησιμοποιήστε τον μόνο όταν εργάζεστε με JSON ή δυναμικά δεδομένα. Record — νέος τύπος στη Dart 3.0, που επιτρέπει την ομαδοποίηση τιμών χωρίς τη δημιουργία ξεχωριστής κλάσης. Ο τελεστής null-aware ?? — ο τυπικός τρόπος εργασίας με τιμές nullable, αντικαθιστώντας μακροσκελείς ελέγχους if-else.
Οι κλάσεις στη Dart — απλή κληρονομικότητα (extends), πολλαπλή μέσω mixin (mixin). Η Dart δεν υποστηρίζει interfaces ως ξεχωριστή έννοια — οποιαδήποτε κλάση μπορεί να υλοποιηθεί (implements). Mixin — κλάση χωρίς κατασκευαστή, της οποίας οι μέθοδοι και τα πεδία μπορούν να προστεθούν σε οποιαδήποτε κλάση μέσω της λέξης-κλειδιού with.
// Κλάσεις, κληρονομικότητα και mixin στη Dart
abstract class Animal {
void sound(); // αφηρημένη μέθοδος
}
mixin Swimmer {
void swim() => print('Swimming...');
}
mixin Flyer {
void fly() => print('Flying...');
}
class Duck extends Animal with Swimmer, Flyer {
@override
void sound() => print('Quack!');
}
void main() {
final duck = Duck();
duck.sound(); // Quack!
duck.swim(); // Swimming...
duck.fly(); // Flying...
}
// Ονομασμένος κατασκευαστής
class Config {
final String env;
Config.development() : env = 'dev';
Config.production() : env = 'prod';
}Η κλάση Duck κληρονομεί από το Animal και χρησιμοποιεί δύο mixin — Swimmer και Flyer. Αυτό επιδεικνύει πολλαπλή κληρονομικότητα χωρίς προβλήματα δομής ρόμβου: τα mixin επιλύονται γραμμικά (super chain). Ονομασμένοι κατασκευαστές (Config.development) — εναλλακτική λύση σε στατικές μεθόδους εργοστασίου για τη δημιουργία αντικειμένων με προκαθορισμένες παραμέτρους.
Ο ασύγχρονος προγραμματισμός στη Dart υλοποιείται μέσω Future (μεμονωμένη τιμή), Stream (ακολουθία τιμών) και async/await. Η Dart χρησιμοποιεί μοντέλο event loop ενός νήματος, παρόμοιο με το JavaScript, αλλά με σημαντική διαφορά: οι μακροχρόνιοι υπολογισμοί δεν μπλοκάρουν το UI, επειδή ο κώδικας Dart εκτελείται σε Isolate — ξεχωριστό νήμα χωρίς κοινόχρηστη μνήμη.
To Future αντιπροσωπεύει μια ασύγχρονη λειτουργία που θα ολοκληρωθεί μετά από κάποιο χρόνο. Το Future μπορεί να είναι σε κατάσταση pending (αναμονή), completed with value (επιτυχία) ή completed with error (σφάλμα). Η αλυσίδα .then().catchError() — εναλλακτική λύση για async/await, αλλά συνιστάται η χρήση του await για αναγνωσιμότητα.
// Ασύγχρονη φόρτωση δεδομένων με Future και Stream
import 'dart:convert';
import 'package:http/http.dart' as http;
class ApiService {
final String baseUrl;
ApiService(this.baseUrl);
// Future για μεμονωμένο αίτημα
Future<Map<String, dynamic>> fetchUser(int id) async {
final response = await http.get(
Uri.parse('$baseUrl/users/$id'),
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('Failed to load user: ${response.statusCode}');
}
}
// Stream για ακολουθία δεδομένων
Stream<int> countStream(int max) async* {
for (var i = 1; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
}
void main() async {
final api = ApiService('https://api.example.com');
// Χρήση του await
final user = await api.fetchUser(1);
print('User: ${user['name']}');
// Επεξεργασία Stream με await for
await for (final count in api.countStream(5)) {
print('Count: $count');
}
}Η κλάση ApiService επιδεικνύει δύο τύπους ασύγχρονου προγραμματισμού: Future για αίτημα HTTP (μία απόκριση) και Stream για έναν σειριακό μετρητή (γεννήτρια με async* και yield). Το Stream είναι αποδοτικό για εργασία με αισθητήρες, γεωτοποθεσία, Firebase Realtime Database — παντού όπου τα δεδομένα φτάνουν συνεχώς. Το Isolate χρησιμοποιεί ξεχωριστή μνήμη — τα δεδομένα μεταδίδονται μέσω SendPort/ReceivePort.
Dart και Flutter σχηματίζουν ένα ενιαίο stack: Flutter — πλαίσιο UI, Dart — γλώσσα περιγραφής UI. Στο Flutter τα πάντα είναι widget (Widget) — από ένα κουμπί μέχρι ολόκληρη την εφαρμογή. Τα widgets μπορεί να είναι stateful (με μεταβλητή κατάσταση) και stateless (αμετάβλητα). Η Dart περιγράφει declarative UI: η build() επιστρέφει ένα δέντρο widgets που το Flutter αποδίδει με το Skia (ή Impeller στο iOS).
Η εφαρμογή Flutter στη Dart αποτελείται από main() → runApp(MyApp()) → MaterialApp. Το MaterialApp περιλαμβάνει δρομολόγηση (routes), θέμα (theme) και εντοπισμό. Κάθε οθόνη είναι ένα Scaffold, που περιέχει AppBar, Body (συνήθως Column/ListView) και BottomNavigationBar. Πλοήγηση μέσω Navigator.push/pop ή ονομασμένων διαδρομών.
// Απλή εφαρμογή Flutter στη Dart
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dart Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Dart + Flutter')),
body: Center(
child: Text('Counter: $_counter'),
),
floatingActionButton: FloatingActionButton(
onPressed: _increment,
child: Icon(Icons.add),
),
);
}
}Το widget HomeScreen — StatefulWidget με εσωτερική κατάσταση _counter. Η κλήση setState() ειδοποιεί το Flutter για την ανάγκη ανακατασκευής του UI — ο κώδικας Dart επανεκκινεί τη build(), δημιουργώντας νέο δέντρο widgets. Το Flutter συγκρίνει αποτελεσματικά (diff) το παλιό και το νέο δέντρο, ενημερώνοντας μόνο τα τροποποιημένα μέρη της οθόνης. Το Hot Reload αντικαθιστά τη build() χωρίς να επαναφέρει την κατάσταση _counter.
Η μεταγλώττιση Dart — υβριδική: JIT για ανάπτυξη και AOT για παραγωγή. Σε λειτουργία debug, το Dart VM εκκινεί τον μεταγλωττιστή JIT που διερμηνεύει byte-code με δυνατότητα καυτής αντικατάστασης κώδικα. Στην έκδοση release, το dart compile exe ή flutter build δημιουργεί εγγενές δυαδικό AOT για συγκεκριμένη αρχιτεκτονική (arm64, x86_64, armv7).
| Λειτουργία | Μεταγλώττιση | Ταχύτητα εκτέλεσης | Μέγεθος δυαδικού | Hot Reload |
|---|---|---|---|---|
| Debug | JIT (VM) | Μεσαία | ~50 MB | Ναι |
| Release | AOT (Native) | Μέγιστη | ~15-20 MB | Όχι |
| Web | dart2js | Εξαρτάται από το πρόγραμμα περιήγησης | Μεταβλητό | Διακομιστής dev |
Η μεταγλώττιση JIT της Dart σε λειτουργία debug παρέχει hot reload σε ~1 δευτερόλεπτο — ο προγραμματιστής βλέπει αλλαγές UI χωρίς απώλεια κατάστασης της εφαρμογής. Η μεταγλώττιση AOT παρέχει απόδοση κοντά σε εγγενείς εφαρμογές Swift/Kotlin. Σύμφωνα με στοιχεία της Google, το Flutter σε Dart AOT επιτυγχάνει 60 FPS ακόμη και σε συσκευές μεσαίας κατηγορίας.
Τα εργαλεία προγραμματιστή Dart περιλαμβάνουν Dart SDK (μεταγλωττιστής dart, dartanalyzer, dartfmt, pub), Flutter SDK και πρόσθετα IDE. Το Dart SDK εγκαθίσταται μαζί με το Flutter SDK στον φάκελο flutter/bin/cache/dart-sdk. Pub — διαχειριστής πακέτων, διαβάζει το pubspec.yaml και κατεβάζει εξαρτήσεις από το pub.dev.
dart analyze — στατικός αναλυτής που ελέγχει τύπους, αχρησιμοποίητα imports και πιθανά σφάλματα. dart format — μορφοποιητής, που φέρνει αυτόματα τον κώδικα σε ενιαίο στυλ. dart doc — γεννήτρια τεκμηρίωσης από σχόλια ///. Flutter DevTools — προφίλερ με προβολή δέντρου widgets, αρχείων καταγραφής, μνήμης και δικτύου. Dart VM Service — αποσφαλμάτωση εκτελούμενης εφαρμογής μέσω WebSocket.
# pubspec.yaml — παραμετροποίηση έργου Dart
name: my_flutter_app
description: A new Flutter project.
version: 1.0.0
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
http: ^1.2.0
provider: ^6.1.0
shared_preferences: ^2.2.0
json_annotation: ^4.8.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.0
json_serializable: ^6.7.0
flutter_lints: ^3.0.0Το αρχείο pubspec.yaml περιγράφει τις εξαρτήσεις του έργου Dart. Το πεδίο environment:sdk καθορίζει την έκδοση Dart — τρέχουσα σταθερή 3.x. Dependencies — κύριες βιβλιοθήκες, dev_dependencies — για δοκιμές και δημιουργία κώδικα. json_annotation + json_serializable παράγουν κώδικα για σειριοποίηση JSON μέσω build_runner. flutter_lints — σύνολο κανόνων για τον αναλυτή.
Συχνές Ερωτήσεις
Dart — γλώσσα προγραμματισμού από την Google (2011), σχεδιασμένη για cross-platform ανάπτυξη σε Flutter. Υποστηρίζει σύνταξη παρόμοια με C, αυστηρή τυποποίηση, μεταγλώττιση JIT και AOT. Ξεχωρίζει για το sound null safety (από Dart 2.12) και τον ασύγχρονο προγραμματισμό μέσω Future και Stream. Χρησιμοποιείται για εφαρμογές κινητών, web και επιτραπέζιων υπολογιστών.
Dart μεταγλωττίζεται σε εγγενή κώδικα (AOT) ή JS (dart2js), η JavaScript — διερμηνεύεται. Η Dart έχει αυστηρή τυποποίηση με sound null safety, ενσωματωμένες κλάσεις και mixin. Ο ασύγχρονος προγραμματισμός της Dart βασίζεται σε Isolate (ξεχωριστά νήματα χωρίς κοινόχρηστη μνήμη), της JS — σε event loop με Web Workers. Η απόδοση της Dart AOT είναι 30-50% υψηλότερη από το V8 JIT σε σενάρια κινητών.
Dart μεταγλωττίζεται AOT σε εγγενή κώδικα ARM μέσω Dart Native. Σε λειτουργία debug, το Dart VM χρησιμοποιεί JIT με hot reload. Το Flutter Engine (C++) αποδίδει το UI μέσω Skia/Impeller. Για Android — flutter build apk, για iOS — flutter build ios. Η web μεταγλώττιση χρησιμοποιεί dart2js ή dart2wasm. Μέγεθος APK έκδοσης release — 15-20 MB (χωρίς διαχωρισμό AAB).
Dart υποστηρίζει πρωτόγονους τύπους: int, double, String, bool. Συλλογές: List, Set, Map, Record. Ειδικοί: Symbol, Runes, Null. Τα πάντα είναι αντικείμενο, συμπεριλαμβανομένων των πρωτόγονων. Null safety: ο τύπος int? επιτρέπει null, ο int — ποτέ null. Τελεστές ??, ??= για ασφαλή εργασία με null. Generics: List<String>, Map<String, dynamic>.
Flutter SDK περιλαμβάνει Dart SDK, Flutter Engine και βιβλιοθήκη widgets. IDE — Android Studio ή VS Code με πρόσθετο Flutter. DevTools — προφίλερ με επιθεωρητή widgets. Pub.dev — διαχειριστής πακέτων με 45 000+ βιβλιοθήκες. Αναλυτής dart analyze και μορφοποιητής dart format — για ποιότητα κώδικα. Build_runner — για δημιουργία μοντέλων JSON.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης