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

В чем разница между dynamic, var и Object?

1.3 Junior🔥 161 комментариев
#Dart

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

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

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

Различия между dynamic, var и Object в Dart

В Dart существуют три разных подхода к объявлению переменных, когда тип заранее неизвестен. Каждый из них имеет свои особенности, поведение и применение. Понимание различий критично для написания безопасного и производительного кода.

var — тип определяется во время компиляции

var — это ключевое слово для локальных переменных, тип которых выводится автоматически. Компилятор определяет тип один раз при присваивании и далее этот тип не меняется.

var name = "Flutter"; // тип String определен при компиляции
name = 123; // ❌ ОШИБКА КОМПИЛЯЦИИ! Нельзя присвоить int

Особенности:

  • Безопасность типов — ошибки выявляются в compile-time
  • Высокая производительность — нет runtime проверок
  • Используется для локальных переменных
  • Тип фиксируется при первом присваивании

Object — суперкласс всех типов

Object — это корневой класс иерархии типов в Dart. Все значения (включая null в sound null safety) наследуют Object.

Object value = "текст";
value = 42;           // ✅ Работает, Object принимает любые значения
value = [1, 2, 3];    // ✅ Работает

String name = value; // ❌ ОШИБКА! Object не может быть присвоен String
// Нужна явная типизация:
String name = value as String; // явное преобразование

Особенности:

  • Объявляется при компиляции как конкретный тип
  • Может хранить любое значение во время выполнения
  • Требует явного приведения типов для извлечения значений
  • Используется в сигнатурах методов, когда нужна гибкость

dynamic — полная свобода с потерей типобезопасности

dynamic — специальный тип, который отключает проверку типов. Его можно сравнить с Any в TypeScript или Object в Java.

dynamic value = "строка";
value = 123;           // ✅ Работает
value = [1, 2, 3];     // ✅ Работает

String name = value;   // ✅ Компилируется, но может упасть в runtime!
int number = value;    // ✅ Компилируется, но может упасть в runtime!

// Любые методы работают без проверки
value.someMethod();    // ✅ Компилируется, но упадёт, если метода нет

Особенности:

  • Нет compile-time проверок типов
  • Ошибки выявляются только в runtime (когда приложение запущено)
  • Максимальная гибкость, минимальная безопасность
  • Используется в интеграции с JavaScript, JSON парсингом, legacy кодом

Сравнительная таблица

АспектvarObjectdynamic
Проверка типовCompile-timeCompile-timeRuntime
Тип фиксируетсяПри объявленииПри объявленииНе фиксируется
ПроизводительностьВысокаяВысокаяНизкая (runtime checks)
Безопасность✅ Максимальная⚠️ Среднее❌ Минимальная
ГибкостьНизкаяСредняяМаксимальная
Примерыvar x = 10;Object x = 10;dynamic x = 10;

Когда использовать каждый

var — в 90% случаев

var user = User.fromJson(data);
var filtered = items.where((i) => i.active);

Object — когда нужно хранить разные типы, но с типобезопасностью

List<Object> items = ["строка", 42, true];
for (var item in items) {
  if (item is String) print(item.length);
  if (item is int) print(item * 2);
}

dynamic — только когда нет альтернативы (JSON, интеграция с JS, reflection)

Map<String, dynamic> json = jsonDecode(response);
var name = json["name"]; // dynamic, потом приводим

Best Practice

  • Приоритет: var > Object > dynamic
  • Избегай dynamic — он ломает типобезопасность и усложняет отладку
  • Используй Object с type guards (is) вместо dynamic
  • Включи strict анализ в analysis_options.yaml

Правильное использование этих типов — основа надежного Dart кода.

В чем разница между dynamic, var и Object? | PrepBro