72 lines
1.9 KiB
Dart
72 lines
1.9 KiB
Dart
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<void> _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);
|
|
});
|
|
}
|