Область видимость переменных в 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) // в данном случае константа позволяет оптимизировать процесс отрисовки блока и заморозить его отступы, а не отрисовывать их каждый раз