Sobes.tech
Назад к вопросам
Junior — Middle
108

В каких компонентах или ситуациях реализуются и выполняются асинхронные задачи в системе?

Компании, где спрашивали
Яндекс МаркетЯндекс Маркет

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Асинхронные задачи в Flutter выполняются там, где нельзя или не нужно блокировать UI-поток: при сетевых запросах, чтении файлов, работе с БД, анимациях, таймерах и обработке событий. Обычно они запускаются из обработчиков UI, бизнес-логики, сервисов и репозиториев. Важно понимать, что сам UI-поток не должен ждать завершения долгой операции.

Определение:

Асинхронная задача — это операция, результат которой приходит позже, без остановки выполнения программы в текущем потоке. В Flutter такие задачи выполняются в основном через Future, async/await, стримы (Stream) и изоляты (Isolate) для тяжёлых вычислений. UI при этом продолжает реагировать на действия пользователя.

Пример использования:

Частый сценарий — загрузка данных с сервера при открытии экрана. Экран строится сразу, а запрос уходит асинхронно, после чего UI обновляется, когда данные получены.

class UserRepository {
  Future<String> loadUserName() async {
    await Future.delayed(const Duration(seconds: 2));
    return 'Alex';
  }
}

class UserScreen extends StatefulWidget {
  const UserScreen({super.key});

  @override
  State<UserScreen> createState() => _UserScreenState();
}

class _UserScreenState extends State<UserScreen> {
  String? userName;

  @override
  void initState() {
    super.initState();
    _loadData();
  }

  Future<void> _loadData() async {
    final name = await UserRepository().loadUserName();
    if (!mounted) return;
    setState(() {
      userName = name;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Text(userName ?? 'Loading...');
  }
}

Пояснение кода:

В этом примере асинхронная задача запускается в initState, то есть после создания экрана. Метод _loadData() вызывает loadUserName(), который возвращает Future и завершится позже. Пока данные загружаются, UI показывает Loading.... Когда Future завершится, вызывается setState, и экран перерисуется с новым значением.

Отдельно важно проверить mounted, чтобы не обновлять состояние уже уничтоженного виджета.

Ключевые моменты:

  • Асинхронные задачи запускают там, где есть ожидание внешнего ресурса или длительной операции.
  • В Flutter это обычно UI-обработчики, initState, сервисы, репозитории, стримы и изоляты.
  • Для I/O операций используют Future и async/await, для потоковых событий — Stream.
  • Тяжёлые вычисления лучше выносить в Isolate, чтобы не блокировать главный поток.
  • Нельзя выполнять долгую работу прямо в build, иначе это ухудшит отзывчивость интерфейса.
  • После асинхронного завершения нужно аккуратно обновлять UI, учитывая жизненный цикл виджета.