custom_workmanager
A Flutter package that extends the capabilities of the workmanager package by providing a cleaner interface to register multiple background tasks with custom callbacks and parameters. Supports both Android and iOS platforms.
This package is ideal for developers who need more flexibility and modularity when scheduling background tasks in Flutter.
Features
- Register multiple background tasks with unique identifiers.
- Support for periodic background tasks with input data.
- Simple and structured callback registration.
- Works on Android.
- Built on top of
workmanager
but offers a more scalable API. - Safe for production, with support for task isolation.
Getting Started
Android Setup
import 'package:custom_workmanager/custom_workmanager.dart';
Initializing:
@pragma('vm:entry-point')
Future<bool> callbackDispatcher(
String taskName, Map<String, dynamic>? inputData) async {
await Future.delayed(const Duration(seconds: 5)); // Define your task here
return true;
}
@pragma('vm:entry-point')
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Workmanager().initializeWithTaskHandler(
callbackDispatcher,
isInDebugMode: false,
);
Workmanager().registerTaskHandler("simpleOneOffTask", callbackDispatcher);
Workmanager().registerTaskHandler("simplePeriodicTask", callbackDispatcher);
runApp(const MyApp());
}
For RegisterOneOffTask
onPressed: () {
Workmanager().registerOneOffTask(
"oneoff_task_1",
"simpleOneOffTask",
inputData: {"key": "value"},
notificationTitle: "One-Off Task",
notificationBody: "Running one-off background task...",
initialDelay: Duration.zero,
constraints: Constraints(
networkType: NetworkType.not_required,
),
);
},
For RegisterPeriodicTask
onPressed: () {
Workmanager().registerPeriodicTask(
"periodic_task_1",
"simplePeriodicTask",
initialDelay: Duration.zero,
frequency: const Duration(minutes: 15),
inputData: {"counter": "1"},
notificationTitle: "Periodic Task",
notificationBody: "Running periodic background task...",
constraints: Constraints(
networkType: NetworkType.not_required,
),
);
},
Android permissions
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
In application tag - add these:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.workmanager-init"
android:exported="false"
tools:node="merge"
tools:replace="android:authorities"/>
<service
android:name="androidx.work.impl.background.systemjob.SystemJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"/>
<receiver
android:name="androidx.work.impl.background.systemalarm.RescheduleReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
tools:replace="android:enabled,android:exported">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
</intent-filter>
</receiver>
<service
android:name="com.pravera.flutter_foreground_task.service.ForegroundService"
android:exported="false"
android:foregroundServiceType="location|dataSync"/>
iOS Setup
Add Required Keys in ios/Runner/Info.plist
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>dev.flutter.background</string>
</array>
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>processing</string>
</array>
min SDK: 21
In your pubspec.yaml
:
dependencies:
custom_workmanager: