Какие механизмы для запуска фоновых задач в Flutter ты знаешь?

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

Ответ

Для фоновых задач в Flutter я выбираю подход в зависимости от требований: короткие задачи при свернутом приложении, периодические задачи или долгоживущие процессы.

1. Для тяжелых вычислений — изоляты (isolates):

// Фоновая обработка данных
Future<void> processDataInBackground() async {
  final processedData = await compute(_processLargeDataset, rawData);

  // Обновляем UI через setState или state management
  setState(() {
    this.data = processedData;
  });
}

static List<Data> _processLargeDataset(List<RawData> rawData) {
  // Эта функция выполняется в отдельном изоляте
  return rawData.map((item) => transformData(item)).toList();
}

2. Для периодических фоновых задач — Workmanager:

// Настройка в main.dart
void callbackDispatcher() {
  Workmanager().executeTask((taskName, inputData) {
    switch (taskName) {
      case 'syncData':
        // Синхронизация данных с сервером
        await syncWithBackend();
        return Future.value(true);

      case 'cleanup':
        // Очистка кэша или временных файлов
        await cleanupStorage();
        return Future.value(true);
    }
    return Future.value(false);
  });
}

// Регистрация периодической задачи
void registerBackgroundTasks() {
  Workmanager().initialize(
    callbackDispatcher,
    isInDebugMode: kDebugMode,
  );

  Workmanager().registerPeriodicTask(
    'daily_sync',
    'syncData',
    frequency: Duration(hours: 24),
    constraints: Constraints(
      networkType: NetworkType.connected,
    ),
  );
}

3. Для долгоживущих фоновых сервисов — flutter_background_service:

// Запуск фонового сервиса
void startBackgroundService() {
  final service = FlutterBackgroundService();

  service.configure(
    androidConfiguration: AndroidConfiguration(
      onStart: onStart,
      isForegroundMode: true,
      autoStart: true,
    ),
    iosConfiguration: IosConfiguration(
      autoStart: true,
      onForeground: onStart,
    ),
  );

  service.startService();
}

// Обработчик фонового сервиса
@pragma('vm:entry-point')
void onStart() {
  final service = FlutterBackgroundService();

  // Сервис работает даже при закрытом приложении
  Timer.periodic(Duration(seconds: 10), (timer) async {
    if (!(await service.isRunning())) {
      timer.cancel();
      return;
    }

    // Выполняем фоновую работу
    await checkForUpdates();

    // Уведомляем UI (если приложение активно)
    service.sendData({'update': 'background_task_completed'});
  });
}

4. Для специфичных платформенных задач:

// Использование MethodChannel для нативных фоновых задач
class BackgroundTaskManager {
  static const platform = MethodChannel('com.example/background');

  static Future<void> scheduleNotificationTask() async {
    try {
      await platform.invokeMethod('scheduleBackgroundNotification', {
        'title': 'Напоминание',
        'body': 'Время проверить приложение',
        'delay': 3600, // секунды
      });
    } on PlatformException catch (e) {
      debugPrint('Failed to schedule: ${e.message}');
    }
  }
}

5. Критерии выбора подхода:

  • Изоляты — для CPU-intensive задач, когда приложение активно
  • Workmanager — для периодических задач (синхронизация, уведомления)
  • Background Service — для долгоживущих процессов (аудио, отслеживание геолокации)
  • Платформенные каналы — когда нужен специфичный нативный функционал

Важно: Фоновые задачи на iOS имеют строгие ограничения, нужно запрашивать соответствующие разрешения и использовать Background Modes в Info.plist.