Ответ
var — это ключевое слово для объявления переменной с выводом типа. Тип переменной определяется компилятором на основе присвоенного значения и затем фиксируется.
String — это конкретный явный тип данных, представляющий строку текста.
// Использование var - тип выводится как String
var message = 'Hello, Flutter!'; // Тип: String
message = 'Updated text'; // OK
// message = 42; // Ошибка компиляции: тип уже String, нельзя присвоить int
// Использование явного типа String
String title = 'My App'; // Тип явно указан
title = 'New Title'; // OK
// title = 100; // Ошибка компиляции: int не может быть присвоен String
// Особенность var с динамическим типом
var dynamicValue; // Тип выводится как dynamic, если нет инициализатора
dynamicValue = 'Text'; // OK
dynamicValue = 123; // OK - тип dynamic позволяет это
Когда что использовать:
var— для локальных переменных, когда тип очевиден из контекста, что улучшает читаемость кода.String(явный тип) — для полей класса, параметров методов, возвращаемых значений, когда требуется явная документация типа или для публичного API.
Важно: В Dart var не создает динамически типизированную переменную (как dynamic). После вывода типа переменная становится строго типизированной.
Ответ 18+ 🔞
А, ну вот, опять про эти ваши var и String! Слушай, история стара как мир, но каждый раз новички в неё влипают, как мухи в варенье. Давай разберёмся без соплей, но с примерами, чтобы понятно было даже тому, кто вчера только print('Hello world') осилил.
Представь, что var — это такой хитрожопый парень на стройке. Ты ему говоришь: «На, держи кирпич». Он смотрит на кирпич и думает: «Ага, значит, я теперь каменщик». И всё, приехали. Он уже не возьмёт в руки бетономешалку или тачку, только кирпичи. Тип его «профессии» зафиксировался.
// Сказал "Hello" — всё, теперь ты строковик до конца дней своих.
var message = 'Hello, Flutter!'; // Компилятор видит строку и говорит: "Окей, чувак, ты теперь String".
message = 'Updated text'; // Без проблем, это же тоже строка.
// message = 42; // А вот тут будет пиздец и ошибка компиляции. Ты чё, обалдел? Ты же кирпичник, а не счетовод! Нельзя int в String пихать.
А String — это когда ты с самого начала, ещё до первой сигареты с утра, заявляешь: «Я, блядь, строковик. Точка». Никаких двусмысленностей.
// Чётко, ясно, без вариантов. Я — строка.
String title = 'My App';
title = 'New Title'; // Ну да, логично.
// title = 100; // А вот это уже «идите вы все нахуй». Компилятор тебя пошлёт сразу. Ты же сам сказал, что ты String!
А теперь главный подвох, от которого волосы дыбом встают. Смотри сюда, это важно!
var dynamicValue; // Вот тут самое интересное. Ты объявил var, но нихуя не положил внутрь.
// Компилятор смотрит на эту пустоту и думает: «Ёпта, ну раз не сказал, кто ты, будешь dynamic — всему голова».
dynamicValue = 'Text'; // Окей, теперь там строка.
dynamicValue = 123; // И тут окей! Потому что тип dynamic — это как пропуск «проходи, не задерживайся». Можно пихать что угодно, но и ответственность вся на тебе.
Так когда же что юзать, чтобы не выглядеть конченым распиздяем?
var— юзай, блядь, для локальных переменных, когда и так всё понятно. Типаvar index = 0;илиvar name = 'Vasya';. Код короче и чище становится, голова не забивается ерундой. Читаешь и сразу ясно, чтоindex— этоint, аname—String.String(и другие явные типы) — вот это уже серьёзно. Это для полей класса (чтобы любой, кто открывает твой код, сразу видел, что тут что), для параметров функций и возвращаемых значений. Это твой публичный договор, твоё лицо. Тут надо быть конкретным, а не мычать что-то невнятное.
И запомни раз и навсегда, чтобы терпения ебать ноль не было: в Dart var — НЕ dynamic (если ты, конечно, не объявил пустую переменную, как в том примере выше). В 99% случаев, когда ты пишешь var и сразу присваиваешь значение, компилятор умный, он выводит тип и намертво его фиксирует. Переменная становится строго типизированной, и попытка запихнуть в неё что-то другое закончится громким «ёперный театр» в виде красной ошибки.
Вот и вся магия. Не усложняй, где не надо, но и не будь манда с ушами — в публичном API всегда явно указывай типы.