Dart: шта је то, карактеристике језика Flutter и програмирање

Аутор: IT Sectr Објављено: 2026-02-10 Време читања: 12 мин

Dart — програмски језик од Google-а, креиран посебно за крос-платформски оквир Flutter. Комбинује JIT компилацију за муњевито вруће преучитавање и AOT компилацију за изворне перформансе у издањима. Dart се користи не само у мобилном развоју, већ и за веб апликације (AngularDart) и серверска решења. Више о могућностима језика прочитајте у званичној документацији Dart-а.

Главно

  • Dart — језик Flutter-а, креиран од Google-а, са JIT/AOT компилацијом
  • Null safety — sound null safety од Dart 2.12 гарантује одсуство null грешака
  • Isolate — паралелизам кроз изоловане нити без дељене меморије
  • Flutter — UI оквир који рендерује виџете преко Skia/Impeller
  • Pub.dev — менаџер пакета са 45 000+ библиотека за Dart и Flutter

Шта је 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-а

Екосистем Dart-а обухвата три главна правца: Flutter (мобилне и десктоп апликације), AngularDart (веб апликације) и Dart Server (серверска решења). Flutter — доминантна платформа: према Statista (2025), Flutter се користи у 46% крос-платформских мобилних пројеката, испред React Native (38%) и Xamarin-а (8%).

Синтакса Dart-а: типови, функције и класе

Синтакса 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
// Основни типови и декларације у 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
// Класе, наслеђивање и миксини у 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-у је реализована кроз 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 ради читљивости.

dart
// Асинхроно учитавање података са 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: архитектура апликације

Dart и Flutter чине један стек: Flutter — UI оквир, Dart — језик за опис UI-ја. У Flutter-у је све виџет (Widget) — од дугмета до целе апликације. Виџети могу бити stateful (са променљивим стањем) и stateless (непроменљиви). Dart описује декларативни UI: build() враћа стабло виџета које Flutter рендерује помоћу Skia (или Impeller на iOS-у).

Структура Flutter апликације

Flutter апликација на Dart-у се састоји од main() → runApp(MyApp()) → MaterialApp. MaterialApp укључује рутирање (routes), тему (theme) и локализацију. Сваки екран је Scaffold, који садржи AppBar, Body (обично Column/ListView) и BottomNavigationBar. Навигација кроз Navigator.push/pop или именоване руте.

dart
// Једноставна 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 vs AOT

Компилација Dart-а — хибридна: JIT за развој и AOT за продукцију. У дебаг режиму Dart VM покреће JIT компилатор који интерпретира бајт-код са могућношћу вруће замене кода. У издању dart compile exe или flutter build креира изворни AOT бинарни фајл за одређену архитектуру (arm64, x86_64, armv7).

РежимКомпилацијаБрзина извршењаВеличина бинарног фајлаHot Reload
DebugJIT (VM)Средња~50 MBДа
ReleaseAOT (Native)Максимална~15-20 MBНе
Webdart2jsЗависи од прегледачаПроменљиваDev сервер

JIT компилација Dart-а у дебаг режиму обезбеђује вруће преучитавање за ~1 секунду — програмер види измене UI-ја без губитка стања апликације. AOT компилација даје перформансе блиске изворним Swift/Kotlin апликацијама. Према Google подацима, Flutter на Dart AOT достиже 60 FPS анимација чак и на уређајима средњег сегмента.

Алати Dart програмера

Алати 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-а.

yaml
# 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?

Dart — програмски језик од Google-а (2011), дизајниран за крос-платформски развој на Flutter-у. Подржава C-сличну синтаксу, строгу типизацију, JIT и AOT компилацију. Одликује се sound null safety-јем (од Dart 2.12) и асинхроношћу кроз Future и Stream. Користи се за мобилне, веб и десктоп апликације.

По чему се Dart разликује од JavaScript-а?

Dart се компилира у изворни код (AOT) или JS (dart2js), JavaScript — се интерпретира. Dart има строгу типизацију са sound null safety-јем, уграђене класе и миксине. Асинхроност Dart-а је заснована на Isolate-у (засебне нити без дељене меморије), JS — на event loop-у са Web Workers. Перформансе Dart AOT су 30-50% веће од V8 JIT у мобилним сценаријима.

Како се Dart компилира у мобилну апликацију?

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?

Dart подржава примитиве: int, double, String, bool. Колекције: List, Set, Map, Record. Специјалне: Symbol, Runes, Null. Све је објекат, укључујући примитиве. Null safety: тип int? дозвољава null, int — никад null. Оператори ??, ??= за безбедан рад са null. Генерици: List<String>, Map<String, dynamic>.

Који алати су потребни за Dart развој?

Flutter SDK укључује Dart SDK, Flutter Engine и библиотеку виџета. IDE — Android Studio или VS Code са Flutter додатком. DevTools — профилер са инспектором виџета. Pub.dev — менаџер пакета са 45 000+ библиотека. Анализатор dart analyze и форматирач dart format — за квалитет кода. Build_runner — за генерисање JSON модела.

Резиме

  • Dart — Google-ов језик за Flutter, који комбинује JIT развој и AOT перформансе
  • Sound null safety од Dart 2.12 (+3.0) — обавезна заштита од null на нивоу типова
  • Асинхроност кроз Future (појединачни резултат), Stream (секвенца), Isolate (паралелизам)
  • Flutter — декларативни UI оквир, где је све виџет (StatelessWidget / StatefulWidget)
  • Hot Reload — JIT преучитавање за ~1 секунду без губитка стања апликације
  • Pub.dev — екосистем пакета (45 000+), управљан преко pubspec.yaml
  • Flutter DevTools — профилер са инспектором виџета, меморије и мреже

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође