import 'dart:async'; import 'dart:io'; import 'dart:isolate'; import 'package:flutter/services.dart'; import 'package:workmanager/workmanager.dart'; import '../Tasks/generate_transactions_task.dart'; import '../Tasks/task.dart'; import 'port_controller.dart'; /// Erstellt Hintergrundtasks und führt diese aus class BackgroundTaskController { /// Erstellt eine neue Instanz dieser Klasse BackgroundTaskController() { if (Platform.isAndroid) { unawaited(Workmanager().initialize(callbackDispatcher)); unawaited( Workmanager().registerPeriodicTask( 'generate-transactions', 'generate_transactions', frequency: const Duration(minutes: 30), initialDelay: const Duration(minutes: 1), ), ); } else { unawaited( Isolate.run(() { unawaited(_runTask( GenerateTransactionsTask(), const Duration(minutes: 1), const Duration(minutes: 30), )); }), ); } } Future _runTask( final Task task, final Duration initialDelay, final Duration frequency, ) async { await Future.delayed(initialDelay); final RootIsolateToken? rootIsolateToken = await PortController() .getRootIsolateToken(); if (rootIsolateToken != null) { BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken); await GenerateTransactionsTask().execute(); } await Future.delayed(frequency); unawaited(_runTask(task, initialDelay, frequency)); } } /// Die Funktion wird von Hintergrundtasks ausgerufen, um diese auszuführen @pragma('vm:entry-point') void callbackDispatcher() { Workmanager().executeTask((final task, final inputData) { switch (task) { case 'generate_transactions': return GenerateTransactionsTask().execute(); } return Future.value(true); }); }