Роза уже рассказывала о модификаторах классов. Сегодня поговорим о еще одной базовой базе для любого Flutter-разработчика — модификаторах переменных в Dart.
Модификаторами переменных называют ключевые слова перед самой переменной при ее объявлении в коде. Они нужны для того, чтобы задать переменной некоторые правила поведения в программе, например, может ли изменяться значение переменной или в какой момент она инициализируется.
var
Этот модификатор является одним из наиболее часто используемых. Он заставляет переменную получить и зафиксировать тип данных при первом присвоении.
var data = 'Привет! Это строка'; // в момент присвоения data получит тип String
data = 'А теперь это другая строка!'; // поменять значение на другое такого же типа можно ✅
data = 123; // а вот на значение другого типа нельзя! ❌
final
Еще один распространенный модификатор. Он говорит о том, что переменной можно присвоить значение только один раз. Последующие изменения невозможны.
final data = DateTime.now(); // задаем начальное значение ✅
data = DateTime.now().add(const Duration(days: 1)); // из-за final при объявлении заменить значение не получится! ❌
const
Это ключевое слово фиксирует значение, присваиваемое переменной. Как и в случае с final, изменить его не получится. Но есть важное отличие от final — const-переменная инициализируется в момент компиляции программы, поэтому присвоить ей значение, получаемое в рантайме, не получится.
const data = 'Привет! Это строка'; // задаем значение известное при компиляции ✅
data = 'А теперь это другая строка!'; // обновить значение нельзя! ❌
const data2 = DateTime.now(); // как и задать значение, которое будет получено только в рантайме! ❌
static
Модификатор static привязывает переменную не к экземпляру, а к самому классу. Обращаться к таким переменным можно, не создавая экземпляр класса, что удобно, например, при работе с абстрактными классами, экземпляр которых создать в целом невозможно. При чем само ключевое слово static не ограничивает изменение значения переменной.
abstract class AbstractExample {
static String value = 'Это значение static переменной';
}
void main() {
print(AbstractExample.value); // выведет в консоль сообщение – Это значение static переменной ✅
AbstractExample.value = 'А это новое значение!';
print(AbstractExample.value); // выведет в консоль сообщение – А это новое значение! ✅
}
late
Инициализация переменной с этим модификатором откладывается до того момента, пока ей не будет присвоено первое значение. С такими переменными стоит быть осторожным — если обратиться к late переменной, которой ранее не было задано никакого значения, получим LateInitializationError.
late String name;
void printName() {
print(name); // получим ошибку, так как значение еще не задано! ❌
}
void printNameSafe() {
name = 'Anna';
print(name); // будет выведено в консоль — Anna ✅
}
Самое интересное, модификаторы переменных можно и нужно комбинировать! Это позволит вам сделать код максимально безопасным, исключить возможность ненужных обновлений данных и оптимизировать вашу программу.
Например:
late final — дает возможность инициализировать переменную позже, но запрещает изменениеstatic const — создает константу класса в момент компиляцииНо тут важно, что некоторые модификаторы друг другу противоречат, поэтому комбинировать их не получится. Например,
const и late.❤️ — если было полезно
