Какие нововведения Dart 3.0 вы активно используете в разработке?

«Какие нововведения Dart 3.0 вы активно используете в разработке?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Из новшеств Dart 3 я чаще всего применяю Records и Pattern Matching, так как они делают код значительно чище.

1. Records (Записи) Идеальны для возврата нескольких значений из функции без создания лишних классов или использования пакетов вроде tuple.

// Возврат нескольких значений из функции
(String, int, bool) getUserInfo() {
  return ('Alice', 30, true);
}

void main() {
  var userInfo = getUserInfo();
  print(userInfo.$1); // Alice (позиционный доступ)

  // Деструктуризация (pattern matching в объявлении)
  var (name, age, isActive) = getUserInfo();
  print('$name is $age years old.');

  // Именованные записи — ещё удобнее
  ({String name, int score}) getScore() => (name: 'Bob', score: 95);
  var scoreData = getScore();
  print(scoreData.name); // Bob (именованный доступ)
}

2. Pattern Matching Крайне полезен в switch и if для декомпозиции данных и exhaustive checking.

// Обработка разных состояний виджета или данных
sealed class ApiResult {}
class Success implements ApiResult {
  final String data;
  Success(this.data);
}
class Failure implements ApiResult {
  final String error;
  Failure(this.error);
}

void handleResult(ApiResult result) {
  switch (result) {
    // Декомпозиция объекта прямо в case
    case Success(:final data):
      print('Success with data: $data');
    case Failure(:final error):
      print('Error: $error');
    // Компилятор проверит, что все варианты sealed-класса обработаны
  }
}

// Использование в if-условиях
if (userInfo case (String name, int age) when age > 18) {
  print('Adult user: $name');
}

3. Class Modifiers Использую для более строгого контроля дизайна библиотек.

  • final class: Чтобы запретить наследование от критически важного класса, например, от состояния BLoC.
  • sealed class: Как в примере выше, для создания закрытых иерархий, которые идеально работают с pattern matching.

4. Обязательный Null Safety Все новые и поддерживаемые проекты теперь строго используют null safety, что исключает целый класс ошибок на этапе разработки.

Эти фичи не просто синтаксический сахар — они позволяют писать более выразительный, безопасный и легко рефакторимый код.