Когда задание выполняется, никакое уведомление не отображается и никакое исключение не перехватывается.
Однако, если я попытаюсь отобразить уведомление в соответствии с документами flutter_local_notifications, т.е. без Workmanager, оно сработает правильно.
Это MRE моего main.dart, который показывает, как я планирую задание и показываю уведомление:
Код: Выделить всё
import 'dart:io';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:intl/intl.dart';
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import 'package:workmanager/workmanager.dart';
import 'package:intl/date_symbol_data_local.dart';
final localNotificationPlugin = FlutterLocalNotificationsPlugin();
bool _initialized = false;
void main() async {
await initialize();
Workmanager().initialize(callbackDispatcher);
runApp(App());
}
@pragma('vm:entry-point')
Future initialize() async {
WidgetsFlutterBinding.ensureInitialized();
await initializeDateFormatting(Platform.localeName, null);
await initLocalNotificationPlugin();
tz.initializeTimeZones();
tz.setLocalLocation(tz.getLocation(DateTime.now().timeZoneName));
}
Future initLocalNotificationPlugin() async {
if (_initialized) {
return;
}
_initialized = true;
const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher');
final DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings();
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin
);
await localNotificationPlugin.initialize(initializationSettings);
}
@pragma('vm:entry-point')
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
print('callbackDispatcher');
try {
await initialize();
} catch (e) {
print("Exception on callbackDispatcher");
print(e);
}
switch (task) {
case "fetchAndShow":
await sendNotification();
break;
default:
// Handle unknown task types
break;
}
return Future.value(true);
});
}
@pragma('vm:entry-point')
Future sendNotification() async {
print('sendNotification');
try {
await localNotificationPlugin.show(
0,
"Notification Title",
"Notification Body",
NotificationDetails(
android: AndroidNotificationDetails("channel_id", "channel_name")
)
);
} catch (e) {
print('Exception on sendNotification');
print(e);
}
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
Workmanager().registerPeriodicTask('dataSync', 'fetchAndShow', frequency: Duration(days: 1));
// Build logic
}
}
- flutter: ^3.9.2
- intl: ^0.20.2
- flutter_local_notifications: ^19.5.0
- часовой пояс: ^0.10.1
- рабочий менеджер: ^0.9.0+3
Обратите внимание, что задание выполняется успешно: я вижу как callbackDispatcher, так и sendNotification, а также
Код: Выделить всё
worker result SUCCESS for Work [ id=GUID, tags={ dev.fluttercommunity.workmanager.BackgroundWorker } ]
Подробнее здесь: https://stackoverflow.com/questions/798 ... orkmanager
Мобильная версия