← Назад к вопросам

Что такое Dart и почему он используется во Flutter?

1.2 Junior🔥 202 комментариев
#Dart

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Dart и почему он используется во Flutter

Dart — это язык программирования, который был разработан Google специально для быстрой разработки мобильных приложений.

Краткая история

2011 — Google создаёт Dart
2015 — Flutter объявляет Dart как основной язык
2018 — Flutter 1.0 рилиз
2020+ — Dart 2.x с null safety и production использование

Почему именно Dart?

1. JIT и AOT компиляция

Dart может компилироваться двумя способами:

┌─────────────────────────┐
│    AOT (Ahead of Time)  │
├─────────────────────────┤
│ Компилируется до запуска│
│ Native код для CPU      │
│ Быстрый запуск          │
│ Используется в Flutter  │
└─────────────────────────┘

┌─────────────────────────┐
│    JIT (Just In Time)   │
├─────────────────────────┤
│ Компилируется во время  │
│ запуска                 │
│ Hot reload в Dart dev   │
└─────────────────────────┘

2. Hot Reload

// Измени код
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text('Hello World!');  // Было 'Hello'
  }
}

// Сохрани файл — приложение обновляется мгновенно!
// Состояние сохраняется, UI обновляется за < 1 сек

Это сокращает цикл разработки с 10+ секунд (Android) до < 1 секунды.

3. Unified Object Model

// В Dart ВСЕ является объектом, даже числа и функции

// Числа
int number = 42;
print(number.isEven);  // true
print(number.toString());  // '42'

// Строки
String text = 'Hello';
print(text.length);  // 5
print(text.toUpperCase());  // 'HELLO'

// Функции
Function myFunc = (int x) => x * 2;
print(myFunc.runtimeType);  // (int) => int

4. Null Safety (с Dart 2.12+)

// ❌ Старый код — null pointer exceptions
String text = null;  // ОШИБКА: не скомпилируется
int len = text.length;  // NullPointerException во время выполнения

// ✅ Новый код — null safety на уровне компилятора
String text = 'Hello';  // Non-nullable string
String? optionalText;   // Nullable string

if (optionalText != null) {
  print(optionalText.length);  // Safe
}

// Оператор ?. — безопасное обращение
print(optionalText?.length);  // null (без ошибки)

5. Garbage Collection и Memory Management

// Dart автоматически управляет памятью
class User {
  String name;
  User({required this.name});
}

void createUsers() {
  List<User> users = [];
  for (int i = 0; i < 1000000; i++) {
    users.add(User(name: 'User $i'));
  }
  // После функции — все объекты удаляются автоматически
  // GC очистит память
}

// Нет нужды в dispose(), finalize() и т.д. (кроме Stream/Timer)

6. Асинхронность — встроенная в язык

// Future и async/await — часть языка
Future<String> fetchData() async {
  final response = await http.get(url);
  return response.body;
}

// async* и yield — для Streams
Stream<int> countStream() async* {
  for (int i = 0; i <= 10; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i;
  }
}

// Стройная синтаксис без callback hell
await fetchData();  // Чистый код

Ключевые особенности Dart

1. Синтаксис

// Похож на Java/C# но проще и современнее
class User {
  final String name;
  final int age;
  
  // Конструктор с named параметрами
  User({required this.name, required this.age});
  
  // Arrow функция
  bool get isAdult => age >= 18;
  
  // Метод
  void printInfo() => print('$name is $age');
}

final user = User(name: 'John', age: 25);
print(user.isAdult);  // true

2. Type System

// Строгая типизация с type inference
var name = 'John';  // String (автоматически определён)
var age = 25;       // int
var isAdmin = true; // bool

// Или явная типизация
String name = 'John';
int age = 25;

// Generics
List<String> names = ['John', 'Jane'];
Map<String, int> ages = {'John': 25, 'Jane': 30};

// Union типы через extension methods
extension on int? {
  bool get isNullOrZero => this == null || this == 0;
}

3. Mixins — множественное наследование

mixin LoggingMixin {
  void log(String message) => print('LOG: $message');
}

mixin TimestampMixin {
  String get timestamp => DateTime.now().toString();
}

class MyClass with LoggingMixin, TimestampMixin {
  void doSomething() {
    log('Started at $timestamp');
  }
}

final obj = MyClass();
obj.doSomething();
// LOG: Started at 2026-03-29 12:34:56.789

4. Extension Methods

// Добавить метод к существующему типу
extension StringExtension on String {
  String capitalize() {
    if (isEmpty) return this;
    return this[0].toUpperCase() + substring(1);
  }
  
  bool get isEmail => contains('@');
}

final text = 'hello';
print(text.capitalize());  // 'Hello'

final email = 'test@example.com';
print(email.isEmail);  // true

Сравнение с другими языками

АспектDartJavaJavaScriptSwift
AOT компиляцияДаНетНетДа
Hot ReloadДаНетДа*Нет
Null SafetyДаЧастичноНетДа
АсинхронностьВстроенаCallbacksPromisesВстроена
Learning CurveЛегкоСреднеЛегкоСложно
Production ReadyДаДаДаДа

Производительность

Производительность приложений Flutter:

┌──────────────────┐
│ Release APK      │
│ (AOT скомпилиров)│ ← ~60fps на среднем телефоне
└──────────────────┘

┌──────────────────┐
│ Debug APK        │
│ (JIT режим)      │ ← ~20-30fps (для разработки)
└──────────────────┘

Dart во Flutter близка к нативной производительности благодаря AOT.

Примеры использования Dart в Flutter

// 1. State Management
class Counter extends ChangeNotifier {
  int _count = 0;
  int get count => _count;
  
  void increment() {
    _count++;
    notifyListeners();
  }
}

// 2. Async операции
Future<List<User>> fetchUsers() async {
  final response = await http.get(Uri.parse('https://api.example.com/users'));
  final json = jsonDecode(response.body) as List;
  return json.map((item) => User.fromJson(item)).toList();
}

// 3. Real-time данные
Stream<Message> getMessages(String chatId) {
  return FirebaseFirestore.instance
      .collection('chats')
      .doc(chatId)
      .collection('messages')
      .snapshots()
      .map((snapshot) => snapshot.docs
          .map((doc) => Message.fromJson(doc.data()))
          .toList())
      .expand((list) => list);  // Распаковать список в Stream
}

Почему Google выбрал Dart для Flutter

  1. AOT компиляция — очень быстрый запуск приложения
  2. Hot Reload — революция в разработке мобильных приложений
  3. Null Safety — меньше ошибок в production
  4. Асинхронность из коробки — perfect для мобильных операций
  5. Garbage Collection — простота управления памятью
  6. Производительность — близка к нативной
  7. Отличная IDE поддержка — VS Code, Android Studio
  8. Большое сообщество — 1+ млн разработчиков

На практике

Dart не сложен для изучения, если ты знаешь:

  • Java — очень похож синтаксис
  • JavaScript — асинхронность знакома
  • Python — простота языка

Большинство разработчиков осваивают Dart за 1-2 недели и начинают писать production код.

Что такое Dart и почему он используется во Flutter? | PrepBro