Начиная с Dart 3.9 по умолчанию будет включен экспериментальный флаг getter-setter-error. Он внесет изменение в то, как компилятор Dart обрабатывает ошибки, связанные с геттерами и сеттерами. На данный момент, если тип аргумента сеттера не совпадает с возвращаемым геттером типом данных:
class Person {
int _age = 0;
int get age => _age;
set age(String value){
var temp = int.tryParse(value);
if (temp != null){
_age = temp;
}
}
}Это приводит к ошибке: "The return type of getter 'age' is 'int' which isn't a subtype of the type 'String' of its setter 'age'." С Dart 3.9 такой код больше не будет считаться ошибкой и может быть собран:
main() {
var person = Person();
print(person.age); // 0
person.age = "10";
print(person.age); // 10
}Еще одним новшеством будет флаг sound-flow-analysis, который изменит работу анализа потока (flow analysis) с акцентом на sound-null-safety.
До текущего момента компилятор всегда проявлял осторожность, даже если тип переменной не допускал null. То есть, анализатор мог по-прежнему считать, что значение может быть null. Из-за такого поведения следующий код не соберется:
main() {
var x = 0;
String y;
if (x != null) y = 'feature enabled';
print(y);
// Error: The non-nullable local variable 'y'
// must be assigned before it can be used.
}Это связано с тем, что анализатор считает, что ветка if не гарантирует исполнение и поэтому выдает ошибку о том, что переменная y возможно не проинициализирована. Dart 3.9 исправляет эту ситуацию и, по своей сути, ставит жирную точку в развитии анализатора Dart: от устаревшей смешанной модели (начиная с Dart 2.12) к строгому sound-null-safety анализу потока (первые шаги были сделаны в Dart 3). Теперь анализ кода будет более точным, что избавит нас от ложных ошибок, а также позволит на уровне компилятора (и подсвечиваемых кусков кода анализатором) убрать мертвые ветки кода во время сборки (разработки) .
Нужны ли нам эти фичи в Dart 3.9?
- 👍 – О, да, детка!!!
- 👌 – Сомнительно, но Окей
- 👎 – Отстой!

Дискуссия