Irbisa · Шпаргалка

Основы Dart

Переменные, типы, функции, null safety и базовый синтаксис Dart

Junior-разработчик · 22 вопроса

  1. 01

    Какие встроенные типы есть в Dart и что значит «всё является объектом»?

    Основные типы Dart: int и double (оба подтипы num), String, bool и коллекции List, Set и Map.

  2. 02

    В чём разница между var, dynamic и Object? в Dart?

    var просит компилятор вывести статический тип из инициализатора; dynamic выключает статическую проверку типов; Object? является настоящим типом, который принимает любое значение, но почти ничего не даёт вызвать, пока вы не проверите, что внутри.

    void main() {  var name = 'Alice';        // inferred as String  // name = 42;              // compile error   dynamic value = 'Alice';  value = 42;                // allowed: no static type…
  3. 03

    В чём разница между final и const в Dart?

    Оба значат, что переменной присваивают значение один раз.

    final startedAt = DateTime.now();   // runtime value: fine for final// const now = DateTime.now();      // compile error: not a constant const maxItems = 100;const colors = ['red', 'green'];    // deeply immutable…
  4. 04

    Что такое sound null safety в Dart и чем отличаются nullable и non-nullable типы?

    Тип без ? никогда не может содержать null, и компилятор это гарантирует; String? явно разрешает null.

    void show(String? email) {      // may be null  // print(email.length);       // compile error: email may be null  if (email != null) {    print(email.length);        // promoted to String inside the if  }}…
  5. 05

    Что делают null-aware операторы ?., ??, ??=, ?.., ...? и оператор !?

    Они обрабатывают null без if: ?. обращается к члену, только если получатель не null, ?? подставляет запасное значение, ??= присваивает, только если переменная null, а ! утверждает, что значение не null, и бросает исключение, если это не так.

    class User {  final String? nickname;  User(this.nickname);} String label(User? user) =>…
  6. 06

    Что делают is, is! и as в Dart и почему as может упасть в рантайме, а is не может?

    is и is! проверяют тип значения в рантайме и возвращают bool, а успешная проверка продвигает переменную до этого типа.

    double priceOf(Map<String, dynamic> json) {  // wrong: throws when the server sends 10 instead of 10.0  // return json['price'] as double;   // right: accept int or double, convert once  return (json['price'] as num).toDouble();…
  7. 07

    Чем отличаются позиционные, именованные и необязательные параметры в Dart и что делает required?

    По умолчанию параметр позиционный и обязательный.

    int add(int a, int b) => a + b;  // positional, required // optional positional: in [ ], must come lastString log(String msg, [String level = 'INFO']) => '[$level] $msg'; // named: in { }, any order at the call site…
  8. 08

    Что такое стрелочные функции, анонимные функции и замыкания в Dart?

    В Dart функция является значением: её можно положить в переменную, передать в другую функцию и вернуть.

    int twice(int x) => x * 2; // named function, arrow body // closure: the returned function keeps `count` aliveint Function() makeCounter() {  var count = 0;  return () => ++count;…
  9. 09

    Что такое typedef в Dart и как объявить тип функции?

    Тип функции описывает сигнатуру: void Function(String) значит «принимает String, ничего не возвращает».

    // a function type written inlinevoid run(int Function(int, int) op) => print(op(2, 3)); // the same idea with namestypedef BinaryOp = int Function(int a, int b);typedef Json = Map<String, dynamic>;          // alias for any type…
  10. 10

    Что может содержать enum в Dart начиная с Dart 2.17 (поля, const-конструктор, методы, implements) и как превратить значение в String и обратно?

    Начиная с Dart 2.17 enum является классом с фиксированным набором константных экземпляров: у него бывают final-поля, const-конструктор, методы и геттеры, и он может реализовать интерфейсы.

    enum Plan implements Comparable<Plan> {  free(priceCents: 0, maxProjects: 3),  pro(priceCents: 999, maxProjects: 50),  team(priceCents: 2999, maxProjects: 500);   const Plan({required this.priceCents, required this.maxProjects});…
  11. 11

    Чем отличаются List, Set и Map и какие методы коллекций должен знать каждый Dart-разработчик?

    Выбирайте по тому, как будете читать данные: List хранит порядок и допускает дубликаты, Set хранит уникальные значения с быстрым contains, Map ищет значения по уникальному ключу.

    class User {  final int id;  final String name;  const User(this.id, this.name);}…
  12. 12

    Как работают каскад .., spread ... и collection if / for в Dart?

    Каскад .. выполняет несколько операций над одним объектом и возвращает этот объект.

    class Request {  String method = 'GET';  final headers = <String, String>{};  void send() => print('$method $headers');}…
  13. 13

    Что выведет этот код и как Dart передаёт объекты в переменные и функции?

    void reassign(List<int> items) {  items = [99];} void mutate(List<int> items) {  items.add(4);} void main() {  final a = [1, 2, 3];  final b = a;  b.add(0);  reassign(a);  mutate(b);  print(a);}

    Выведет [1, 2, 3, 0, 4].

  14. 14

    Если бы каждая из строк A–E выполнялась отдельно, какие из них бросят исключение в рантайме и какой список в каждой переменной?

    void main() {  final a = [1, 2];  a.add(3);                    // line A   const b = [1, 2];  b.add(3);                    // line B   final c = List.unmodifiable(a);  c[0] = 9;                    // line C   final d = List.filled(2, 0);  d[0] = 9;                    // line D  d.add(1);                    // line E}

    Строки B, C и E бросят UnsupportedError; A и D отработают.

  15. 15

    Найдите баг: после одного хода X появляется в каждой строке этой доски.

    class Board {  Board(this.size) : cells = List.filled(size, List.filled(size, '.'));   final int size;  final List<List<String>> cells;   void place(int row, int col, String mark) => cells[row][col] = mark;   String render() => cells.map((row) => row.join()).join('\n');} void main() {  final board = Board(3)..place(0, 1, 'X');  print(board.render());}

    List.filled вычисляет значение-заполнитель один раз, поэтому все строки указывают на один и тот же объект внутреннего списка.

  16. 16

    Как устроена обработка ошибок в Dart и чем Exception отличается от Error?

    Опасный код оборачивают в try, конкретные типы обрабатывают через on Type, объект и стек-трейс получают через catch (e, st), а очистку делают в finally.

    class PaymentDeclined implements Exception {  final String code;  const PaymentDeclined(this.code);  @override  String toString() => 'PaymentDeclined($code)';}…
  17. 17

    Для чего в Dart нужен assert и почему проверку данных в продакшене нужно делать через throw, а ветки только для debug оформлять через kDebugMode?

    assert(condition, message) проверяет ваши собственные допущения во время разработки.

    import 'package:flutter/foundation.dart'; class Badge {  final int count;  // our own invariant: checked in debug, gone in release  const Badge(this.count) : assert(count >= 0, 'count must be >= 0');…
  18. 18

    Что выведет этот код и почему цикл for и цикл while ведут себя по-разному?

    void main() {  final callbacks = <void Function()>[];   for (var i = 0; i < 3; i++) {    callbacks.add(() => print(i));  }   var j = 0;  while (j < 3) {    callbacks.add(() => print(j));    j++;  }   for (final cb in callbacks) cb();}

    Выведет 0 1 2 3 3 3, по одному числу на строку.

  19. 19

    Найдите баг: этот контроллер иногда падает с «Null check operator used on a null value» в refreshAvatar.

    class ProfileController {  ProfileController(this.api);  final AvatarApi api;  User? user; // cleared on logout   Future<void> refreshAvatar() async {    if (user == null) return;    final url = await api.fetchAvatarUrl(user!.id);    user!.avatarUrl = url;  }   void logout() => user = null;}

    user является полем, а await даёт выполниться другому коду: если logout() обнулит его, пока запрос в пути, user! в последней строке бросит исключение.

  20. 20

    В чём разница между == и identical() в Dart и как на неё влияет канонизация const?

    identical(a, b) проверяет, указывают ли две ссылки на один и тот же объект в памяти; == проверяет равенство так, как его определил класс.

    class Point {  final int x, y;  const Point(this.x, this.y);} class Money {…
  21. 21

    Почему 0.1 + 0.2 == 0.3 в Dart даёт false и как хранить и считать деньги?

    double является 64-битным двоичным числом с плавающей точкой: у 0.1 нет точного двоичного представления, и ошибки округления накапливаются.

    String formatCents(int cents) =>    '${cents ~/ 100}.${(cents % 100).toString().padLeft(2, '0')}'; void main() {  print(0.1 + 0.2);                         // 0.30000000000000004  print(0.1 + 0.2 == 0.3);                  // false…
  22. 22

    Чем отличаются UTC и локальные значения DateTime в Dart и как хранить и сравнивать даты, чтобы пользователи за границей видели верное время?

    DateTime хранит момент времени (микросекунды с 1970 года по UTC) и флаг isUtc; часового пояса в нём нет.

    void main() {  // wrong: no Z, parsed as LOCAL, so the instant differs per device  final a = DateTime.parse('2026-03-29T10:00:00');  // right: explicit UTC, the same instant everywhere  final b = DateTime.parse('2026-03-29T10:00:00Z');…