1/Путь к первому мобильному приложению. Часть 1.3 - Изучаем язык Dart: Видимость переменных, const и final

Область видимость переменных в Dart определяется компоновкой кода

bool value = true;
void main() {
  bool valueMain = true;
  void myFunction ( ) {
    bool valueMyFunction = true;
    print ( value );
    print ( valueMain );
    print ( valueMyFunction );
    valueMain = false;
  }
  myFunction ( );
  // true
  // true
  // true
  
  print ( value ); // true
  print ( valueMain ); // false, так как ранее мы изменили значение в myFunction ( );
  // print ( valueMyFunction ); // Закомментировано, так как иначе вызовет ошибку Getter not found
}

Замыкание в Dart работает по тем же принципам что и в других языках

// closures (замыкание)
Function toConvert ( num value ) {
  return ( num amount ) => print ( amount * value );
}
var toUSD = toConvert ( 70 );
var toEUR = toConvert ( 80 );
toUSD ( 12.5 ); // 875
toEUR ( 11 ); // 880

Константы в Dart

// Константы
const constName = 'keyAPI';
const constInteger = 2 + 3;
const constDouble = 7.2;
const constListOfDouble = [2.7,constDouble];
//const const5EUR = toEUR ( 5 ); // Ошибка, константам нельзя назначать вычисляемые через функции значения

// final (не является константой и ей можно назначать результат функции)
final final5EUR = toEUR ( 5 );
//final pi; // недопустимо, надо сразу назначать
final pi = 3.14159;
final finalList = [1,2,3,4,5];
finalList.add ( 6 ); // внутреннее состояние мы изменить можем
print ( finalList ); // [1, 2, 3, 4, 5, 6]
//constListOfDouble.add ( 1.1 ); // для константы мы уже изменить внутреннее состояние не можем

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

Константы предпочтительно использовать когда заранее известно что переменная меняться не будет, либо как в примере далее для оптимизации отрисовки:

// Важное замечание по константам!
margin: const EdgeInsert.all(4) // в данном случае константа позволяет оптимизировать процесс отрисовки блока и заморозить его отступы, а не отрисовывать их каждый раз