Dart — програмски језик од Google-а, креиран посебно за крос-платформски оквир Flutter. Комбинује JIT компилацију за муњевито вруће преучитавање и AOT компилацију за изворне перформансе у издањима. Dart се користи не само у мобилном развоју, већ и за веб апликације (AngularDart) и серверска решења. Више о могућностима језика прочитајте у званичној документацији Dart-а.
Главно
Dart — програмски језик са C-сличном синтаксом, развијен од стране Google-а под вођством Ларса Бака (креатора Eclipse-а). Прво издање је објављено 2011. године, али прави популарност Dart је стекао 2018. године са изласком Flutter 1.0. Језик је дизајниран за креирање корисничких интерфејса: има уграђену подршку за стримове, future и реактивне обрасце.
Филозофија Dart-а — "равнотежа перформанси и продуктивности". Језик подржава две стратегије компилације: JIT (Just-In-Time) за развој са врућим преучитавањем и AOT (Ahead-Of-Time) за издања са изворним перформансама. JIT компилатор убацује измењени код у апликацију која ради за милисекунде, без потребе за поновном компилацијом APK-а — то је кључна предност Dart-а у односу на друге језике у контексту мобилног развоја.
Кључна карактеристика Dart-а — sound null safety, уведен у Dart 2.12 (2021). Систем типова гарантује да променљива не може бити null без експлицитног навођења (int?). Ово елиминише NullPointerException у фази компилације. Према Google подацима, увођење null safety-ја смањило је број крашева у Flutter апликацијама за 30% у продукционом окружењу.
Екосистем Dart-а обухвата три главна правца: Flutter (мобилне и десктоп апликације), AngularDart (веб апликације) и Dart Server (серверска решења). Flutter — доминантна платформа: према Statista (2025), Flutter се користи у 46% крос-платформских мобилних пројеката, испред 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 оператор
// Колекције са генерицима
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). Dart не подржава интерфејсе као посебан концепт — било која класа може бити имплементирана (implements). Миксин — класа без конструктора, чији методи и поља могу бити додати у било коју класу кроз кључну реч with.
// Класе, наслеђивање и миксини у 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 и користи два миксина — Swimmer и Flyer. Ово демонстрира вишеструко наслеђивање без проблема ромбоидне структуре: миксини се линеарно решавају (super chain). Именовани конструктори (Config.development) — алтернатива статичким фабричким методима за креирање објеката са унапред подешеним параметрима.
Асинхроност у Dart-у је реализована кроз Future (појединачна вредност), Stream (секвенца вредности) и async/await. Dart користи једнонитни модел са event loop-ом, сличан JavaScript-у, али са битном разликом: дуготрајна израчунавања не блокирају UI, јер се Dart код извршава у Isolate-у — засебној нити без дељене меморије.
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 чине један стек: Flutter — UI оквир, Dart — језик за опис UI-ја. У Flutter-у је све виџет (Widget) — од дугмета до целе апликације. Виџети могу бити stateful (са променљивим стањем) и stateless (непроменљиви). Dart описује декларативни UI: build() враћа стабло виџета које 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),
),
);
}
}Виџет HomeScreen — StatefulWidget са унутрашњим стањем _counter. Позив setState() обавештава Flutter о потреби за поновним изградњом UI-ја — Dart код поново покреће build(), креирајући ново стабло виџета. Flutter ефикасно пореди (diff) старо и ново стабло, ажурирајући само измењене делове екрана. Hot Reload замењује build() без ресетовања стања _counter.
Компилација Dart-а — хибридна: JIT за развој и AOT за продукцију. У дебаг режиму Dart VM покреће JIT компилатор који интерпретира бајт-код са могућношћу вруће замене кода. У издању 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-а у дебаг режиму обезбеђује вруће преучитавање за ~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 — статички анализатор који проверава типове, неискоришћене импорте и потенцијалне грешке. dart format — форматирач, аутоматски доводи код у јединствен стил. dart doc — генератор документације из /// коментара. Flutter DevTools — профилер са прегледом стабла виџета, логова, меморије и мреже. 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), дизајниран за крос-платформски развој на Flutter-у. Подржава C-сличну синтаксу, строгу типизацију, JIT и AOT компилацију. Одликује се sound null safety-јем (од Dart 2.12) и асинхроношћу кроз Future и Stream. Користи се за мобилне, веб и десктоп апликације.
Dart се компилира у изворни код (AOT) или JS (dart2js), JavaScript — се интерпретира. Dart има строгу типизацију са sound null safety-јем, уграђене класе и миксине. Асинхроност Dart-а је заснована на Isolate-у (засебне нити без дељене меморије), JS — на event loop-у са Web Workers. Перформансе Dart AOT су 30-50% веће од V8 JIT у мобилним сценаријима.
Dart се компилира AOT у изворни ARM код преко Dart Native-а. У дебаг режиму Dart VM користи JIT са врућим преучитавањем. Flutter Engine (C++) рендерује UI преко Skia/Impeller. За Android — flutter build apk, за iOS — flutter build ios. Веб компилација користи dart2js или dart2wasm. Величина release APK-а — 15-20 MB (без поделе AAB).
Dart подржава примитиве: int, double, String, bool. Колекције: List, Set, Map, Record. Специјалне: Symbol, Runes, Null. Све је објекат, укључујући примитиве. Null safety: тип int? дозвољава null, int — никад null. Оператори ??, ??= за безбедан рад са null. Генерици: List<String>, Map<String, dynamic>.
Flutter SDK укључује Dart SDK, Flutter Engine и библиотеку виџета. IDE — Android Studio или VS Code са Flutter додатком. DevTools — профилер са инспектором виџета. Pub.dev — менаџер пакета са 45 000+ библиотека. Анализатор dart analyze и форматирач dart format — за квалитет кода. Build_runner — за генерисање JSON модела.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође