schedule static method

Future<void> schedule(
  1. String name, {
  2. Duration? interval,
  3. CronSchedule? cron,
  4. Map<String, dynamic> input = const {},
  5. TaskConstraints? constraints,
  6. RetryPolicy? retry,
  7. TaskPriority priority = TaskPriority.normal,
  8. Duration? initialDelay,
  9. List<String> tags = const [],
  10. TimeWindow? window,
})

Schedules a periodic task with optional cron expression and time window.

On Android, the interval must be at least 15 minutes. On iOS, the system controls actual timing (best-effort).

Supports cron expressions for complex scheduling and time windows to restrict execution to specific hours/days.

Example with interval:

await TaskFlow.schedule(
  'syncData',
  interval: Duration(hours: 1),
  constraints: TaskConstraints(network: NetworkConstraint.unmetered),
);

Example with cron:

await TaskFlow.schedule(
  'dailyReport',
  cron: CronSchedule.daily(hour: 9),  // Every day at 9am
);

Example with time window:

await TaskFlow.schedule(
  'sync',
  interval: Duration(hours: 1),
  window: TimeWindow.offPeak,  // Only 2am-5am
);

Implementation

static Future<void> schedule(
  String name, {
  Duration? interval,
  CronSchedule? cron,
  Map<String, dynamic> input = const {},
  TaskConstraints? constraints,
  RetryPolicy? retry,
  TaskPriority priority = TaskPriority.normal,
  Duration? initialDelay,
  List<String> tags = const [],
  TimeWindow? window,
}) async {
  _ensureInitialized();

  // Must have either interval or cron
  if (interval == null && cron == null) {
    throw ArgumentError('Must provide either interval or cron expression');
  }

  // Enforce 15-minute minimum for interval
  if (interval != null && interval.inMinutes < 15) {
    throw ArgumentError(
      'Periodic task interval must be at least 15 minutes. Got: ${interval.inMinutes}min',
    );
  }

  await TaskFlowPlatform.instance.schedule(
    name: name,
    intervalMs: interval?.inMilliseconds ?? 0,
    input: input,
    constraints: constraints?.toMap(),
    retry: retry?.toMap(),
    priority: priority.name,
  );
}