Dart 3.10: dot-shorthands и Private Named Parameters

Я — MADTeacher, автор книг по Dart/Flutter/ИИ в программировании и преподаватель. На канале разбираю свежие фичи языка и фреймворка, объясняю, как и когда их применять, и показываю всё на живых примерах кода. Меньше воды — больше практики: от конструкторов и метапрограммирования до производительности, интеропа и тестирования, а также поднимаю тему использования ИИ для разработки программных продуктов. Если хотите понимать Dart и Flutter в эпоху ИИ глубже — вы по адресу.

dartdot-shorthandsprivate named parameters

Данная фича будет включена по умолчанию в Dart 3.10 и предоставит нам возможность обращаться к конструкторам и статическим полям и метода классов, enum без указания их имени. Т.е. тип объекта, к которому проводится обращение будет выведен за счет скоупа его использования. Это позволит писать более компактный код:

Color color = .blue;
switch (color) {
  case .blue:
    print('blue');
  case .red:
    print('red');
  case .green:
    print('green');
}
Column(
  crossAxisAlignment: .start,
  mainAxisSize: .min,
  children: widgets,
)

Также в директорию accepted переместилась спецификация фичи "Private Named Parameters", которая решает проблему с приватными именами полей, позволяя инициализировать их через именованные аргументы конструктора класса. Ранее это было невозможно, так как Dart запрещал использовать имена параметров, начинающиеся с _ (нижнего подчеркивания) в публичных конструкторах c именованными аргументами. Но теперь все меняется!😄

Если раньше вам нужно было использовать список инициализации:

class House {
  int? _windows;
  int? _bedrooms;
  int? _swimmingPools;

  House({
    int? windows,
    int? bedrooms,
    int? swimmingPools,
  })  : _windows = windows,
        _bedrooms = bedrooms,
        _swimmingPools = swimmingPools;
}

То теперь код конструктора сокращается до:

class House {
  int? _windows;
  int? _bedrooms;
  int? _swimmingPools;

  House({this._windows, this._bedrooms, this._swimmingPools});
}

А с появлением первичного конструктора такое объявление класса сократится до следующей записи:

class House({
  int? _windows,
  int? _bedrooms,
  int? _swimmingPools,
});

p.s. Очень надеюсь, что релиз этой фичи не придется ждать пару лет и он порадует нас в следующем году🫠

Как вам новые фичи Dart?

  • 👍 – О, да, детка!!!
  • 👌 – Сомнительно, но Окей
  • 👎 – Отстой!
Превью канала MADTeacher: крупный текст «Что же Dart такого нам готовит?», темный фон, портрет автора справа, логотип канала и ссылка на t.me
Обложка поста с вопросом о будущем Dart и портретом автора.

Дискуссия

Андрей
MADTeacher | Станислав Чернышев
Также в директорию accepted переместилась спецификация фичи "Private Named Parameters",
Неужели
MADTeacher | Станислав Чернышев
Николай
А как этот конструктор извне вызываться будет? Также с нижним подчеркиванием? House(_windows=2, _bedrooms=2)
Нет, нижнее подчеркивание на уровне использования будет экранироваться
class Tool {
  int _price;

  Tool({this._price}); // Private name here.
}

void cheapTool() => Tool(price: 1); // Called with public name.

class Hammer extends Tool {
  Hammer({super.price}); // And thus call with public name here too.
}

void pricyHammer() => Hammer(price: 200);
TheLastRay (:
MADTeacher | Станислав Чернышев
Нет, нижнее подчеркивание на уровне использования будет экранироваться class Tool { int _price; Tool({this._price}); // Private name here. } void cheapTool() => Tool(price: 1); // Called with public name. class Hammer extends Tool { Hammer({super.price});…
Окак То есть оно чисто само создаёт публичный аналог Получается мы не можем сделать одновременно переменную _test и test в одном конструкторе?
Денис Рева
Имхо, "Сомнительно, но окей", так как при чтении кода теперь нужно выяснять в голове, к какому объекту это всё может относиться. Где-то это уместно, где-то может получиться нечитаемо
MADTeacher | Станислав Чернышев
TheLastRay (:
Окак То есть оно чисто само создаёт публичный аналог Получается мы не можем сделать одновременно переменную _test и test в одном конструкторе?
угу
Андрей
TheLastRay (:
То есть оно чисто само создаёт публичный аналог
По сути геттер/сеттер?
MADTeacher | Станислав Чернышев
Андрей
По сути геттер/сеттер?
Нет, это действует только на уровне конструктора. Компилятор будет автоматически «удалять» подчеркивание из параметра, но для поля, инициализированного этим параметром, оно останется приватным.
S Afanasov
аспирант какой-то придумал)
Егор
Перенимаем с kotlin все
Присоединиться к обсуждению →

Читайте так же