Что такое snapshot в контексте Flutter?

«Что такое snapshot в контексте Flutter?» — вопрос из категории State Management, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Flutter snapshot (снимок) — это объект, инкапсулирующий текущее состояние асинхронной операции. Он используется виджетами FutureBuilder и StreamBuilder для безопасного построения UI на основе данных, которые могут быть в процессе загрузки, успешно получены или содержать ошибку.

Структура AsyncSnapshot: Объект AsyncSnapshot<T> содержит несколько критически важных свойств:

  • connectionState: Текущая фаза (ConnectionState.waiting, .active, .done).
  • data: Успешно полученные данные типа T (или null).
  • error: Объект ошибки, если операция завершилась с исключением.
  • hasData / hasError: Булевы флаги для удобной проверки.

Практический пример с FutureBuilder для загрузки профиля:

FutureBuilder<UserProfile>(
  future: _fetchUserProfile(), // Future<UserProfile>
  builder: (context, AsyncSnapshot<UserProfile> snapshot) {
    // 1. Проверяем состояние соединения и наличие ошибки
    if (snapshot.connectionState == ConnectionState.waiting) {
      return Center(child: CircularProgressIndicator());
    }

    if (snapshot.hasError) {
      return Center(child: Text('Ошибка: ${snapshot.error}'));
    }

    // 2. Данные гарантированно есть, можно безопасно обращаться к snapshot.data
    final user = snapshot.data!;
    return Column(
      children: [
        Text('Имя: ${user.name}'),
        Text('Email: ${user.email}'),
      ],
    );
  },
)

Ключевая идея: Snapshot отделяет логику асинхронного получения данных от синхронного процесса построения виджетов, предоставляя согласованный и типобезопасный интерфейс для работы с состоянием «загрузка-данные-ошибка».