Ответ
Ключевое слово var в Dart используется для объявления переменной с автоматическим выводом типа (type inference). Тип переменной определяется компилятором на основе значения, присвоенного при инициализации, и после этого фиксируется.
Основные правила и отличия:
| Ключевое слово | Определение типа | Изменяемость | Повторное присваивание |
|---|---|---|---|
var |
Выводится при инициализации, затем фиксирован. | Да (но тип менять нельзя). | Да, значением того же типа. |
dynamic |
Не проверяется на этапе компиляции. | Да. | Да, значением ЛЮБОГО типа. |
final |
Выводится или задается явно, затем фиксирован. | Нет (переменная только для чтения). | Нет, только одно присваивание. |
const |
Выводится или задается явно, значение известно на этапе компиляции. | Нет. | Нет. |
Практические примеры:
// VAR: тип выводится как String
var name = 'Alice'; // Тип: String
name = 'Bob'; // OK
// name = 42; // ОШИБКА компиляции: тип int не может быть присвоен переменной типа String
// DYNAMIC: отключает проверку типов на этапе компиляции
dynamic data = 'Hello';
data = 100; // OK, тип изменен с String на int
data = []; // OK, тип изменен на List
// Ошибки типа обнаруживаются только во время выполнения (Runtime Error).
// FINAL: переменная только для чтения
final apiKey = 'abc123'; // Тип выведен как String
// apiKey = 'xyz'; // ОШИБКА компиляции: final переменную нельзя изменить.
final List<int> numbers = [1, 2, 3];
numbers.add(4); // OK, содержимое mutable-коллекции можно менять.
// numbers = [5, 6]; // ОШИБКА: нельзя присвоить новый объект.
// CONST: константа времени компиляции
const maxItems = 10; // Значение должно быть известно при компиляции.
const defaultPadding = EdgeInsets.all(8.0);
Рекомендация по использованию в Flutter:
- Используйте
var, когда тип значения очевиден из контекста (var controller = TextEditingController()). - Избегайте
dynamicбез крайней необходимости (например, при работе с JSON до десериализации в модель). - Широко используйте
finalдля переменных, которые не должны переназначаться — это делает код безопаснее и понятнее.
Ответ 18+ 🔞
Слушай, давай разберёмся с этим var, а то народ иногда путается, как будто на дворе 2002-й год и только типы узнали. В общем, представь, что var — это такой удобный костыль, но хороший. Ты говоришь языку: «Слушай, чувак, вот я кладу в эту коробку строку, сам, блядь, догадайся, что это String, и больше меня не еби». И компилятор такой: «Окей, понял, String так String».
Но вот тут главный подвох, ёпта: как только он тип вывел — всё, приехали. Эта коробка теперь только для строк. Попробуй сунуть туда число — получишь ошибку компиляции прямо в лоб, как будто тебе вилкой в глаз. Это не dynamic, где можно нести любую хуйню и надеяться, что в рантайме не вылезет пиздец.
Вот смотри, на примерах как на ладони:
var name = 'Вася'; // Всё, компилятор запомнил: name — это String, ебать его в сраку.
name = 'Петя'; // Нормально, Петя тоже строка.
// name = 42; // А вот это уже НИНАДА. Ошибка. Тип int не лезет в переменную типа String. Совсем.
А теперь, чтобы волнение ебать не возникало, глянем на разницу со всеми этими штуками:
var— «Угадай тип сам, но потом не ной». Менять значения можно, но только того же типа.dynamic— «А похуй, делай что хочешь, я тебя не остановлю». Типовая проверка отключена. Можно строку присвоить, потом число, потом список. А потом в три часа ночи получитьNoSuchMethodErrorи охуеть. Доверия к нему — ноль ебать.final— «Один раз назвал — навсегда». Переменная только для чтения. Новый объект присвоить нельзя, но если это список, то внутрь добавлять можно. Надежно, как швейцарский банк.const— «Всё, приехали, константа». Значение должно быть известно прямо при компиляции. Никаких телодвижений в рантайме.
Так когда это говно использовать? Да очень просто, чувак.
var— юзай, когда сходу понятно, что там.var controller = TextEditingController(). И так ясно, что контроллер. Зачем писать полтора лишних слова?dynamic— обходи стороной, как мартышку с гранатой. Только если реально без вариантов, например, пока парсишь JSON и ещё не превратил его в нормальную модель.final— вот это, блядь, золотая жила. Используй везде, где переменная не должна меняться. Код чище, безопаснее, и ты сам от себя не охуеешь потом, когда пытаешься понять, кто и где её перезаписал.
Короче, var — он как удобные тапки. Внутри дома — самое то. Но выходить в них на улицу (там, где нужна строгая типизация или иммутабельность) — уже пиздопроебибна идея. Для улицы есть final и явные типы. Держи это в голове, и всё будет пучком.