flutter - workmanager 的通知详细信息有误
问题描述
我正在尝试显示带有 24 小时检查的条件信息的通知。我正在flutter_local_notification
与工作经理一起使用,并且在预定时间收到通知。但是,它没有按预期显示消息。这是我的代码:
class NotificationServices{
static AndroidNotificationDetails androidSettings;
static IOSNotificationDetails iosSettings;
static FlutterLocalNotificationsPlugin fltrNotification;
static initializer(){
fltrNotification = FlutterLocalNotificationsPlugin();
androidSettings = AndroidNotificationDetails(
'Expiry Id', 'Expiry', 'Expired',
playSound: true, enableVibration: true,
importance: Importance.max, priority: Priority.max);
iosSettings = IOSNotificationDetails();
var androidInitialize = new AndroidInitializationSettings('exercise_icon');
var iOSInitialize = new IOSInitializationSettings();
var initializationSettings = new InitializationSettings(
android: androidInitialize, iOS: iOSInitialize);
fltrNotification.initialize(initializationSettings);
}
static showNotification() async {
var notifDetails = NotificationDetails(android: androidSettings, iOS: iosSettings);
List<Member> memList = await checkDate();
if(memList.isNotEmpty){
memList.forEach((member) async{
var scheduledTime = DateTime.parse(member.date);
final timeZone = TimeZone();
String timeZoneName = await timeZone.getTimeZoneName();
final location = await timeZone.getLocation(timeZoneName);
final scheduledDate = tz.TZDateTime.from(scheduledTime, location).add(Duration(minutes: 35));
fltrNotification.show(
member.id,
'Subscription Notification',
'${member.surname} ${member.firstName}\'s subscription has expired.',
notifDetails
);
// await fltrNotification.zonedSchedule(
// member.id,
// 'Subscription Notification',
// '${member.surname} ${member.firstName}\'s subscription has expired.',
// scheduledDate,
// notifDetails,
// uiLocalNotificationDateInterpretation:
// UILocalNotificationDateInterpretation.absoluteTime,
// androidAllowWhileIdle: true);
});
}
}
}
这是 main.dart 初始化 workmanager 的地方:
void callbackDispatcher() {
Workmanager.executeTask((taskName, inputData) {
NotificationServices.initializer();
NotificationServices.showNotification();
return Future.value(true);
});
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
Workmanager.initialize(
callbackDispatcher,
isInDebugMode: true,
);
Workmanager.registerPeriodicTask(
'4',
'simplePeriodicTask',
frequency: Duration(minutes: 15),
);
runApp(MyApp());
}
Future<List<Member>>checkDate() async {
MemberServices memServices = MemberServices();
List<Member> memList = List<Member>();
DateTime now = DateTime.now();
List<Member> membersList = await memServices.getAllMembers();
membersList.forEach((member) async {
DateTime expiryDate = DateTime.parse(member.date);
if (now.isAfter(expiryDate)) {
member = Member(
id: member.id,
surname: member.surname,
firstName: member.firstName,
date: member.date,
active: 'false');
await memServices.updateMember(member);
memList.add(member);
}
});
return memList;
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primaryColor: Color(0xFF070707),
accentColor: Colors.purple[800]
),
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
但是没有 workmanager 它可以正常工作。我需要一个情况。
解决方案
我刚刚解决了这个实际上非常微小的问题。Workmanager 方法是未来的,我没有意识到这一点,所以我没有等待它们,其次,我的代码仅在满足特定条件并且每天午夜才满足条件时才显示通知,所以我忽略了该条件暂且。第三,在 void main 之前,我将回调和 showNotification 设置为顶层。现在我的代码看起来像这样
const simplePeriodicTask = 'simplePeriodicTask';
MemberServices memberServices = MemberServices();
Future _showNotification(fltrNotification) async {
var androidSettings = AndroidNotificationDetails(
'Expiry Id', 'Expiry', 'Expired',
playSound: true, enableVibration: true,
importance: Importance.max, priority: Priority.max);
var iosSettings = IOSNotificationDetails();
var notifDetails = NotificationDetails(android: androidSettings, iOS: iosSettings);
await fltrNotification.show(
1,
'Subscription Notification',
'Faith\'s subscription has expired.',
notifDetails
);
}
Future<void> main() async{
WidgetsFlutterBinding.ensureInitialized();
print('here ****************************************************************');
await Workmanager.initialize(
callbackDispatcher,
isInDebugMode: true,
);
print('got here three');
await Workmanager.registerPeriodicTask(
'5',
simplePeriodicTask,
frequency: Duration(minutes: 15),
initialDelay: Duration(seconds: 10)
);
runApp(MyApp());
}
void callbackDispatcher(){
print('dispatch -----------------------------------------------------------------');
Workmanager.executeTask((taskName, inputData) async{
FlutterLocalNotificationsPlugin fltrNotification = FlutterLocalNotificationsPlugin();
var androidInitialize = new AndroidInitializationSettings('exercise_icon');
var iOSInitialize = new IOSInitializationSettings();
var initializationSettings = new InitializationSettings(
android: androidInitialize, iOS: iOSInitialize);
fltrNotification = new FlutterLocalNotificationsPlugin();
fltrNotification.initialize(initializationSettings);
List<Member> memList = await memberServices.checkDate();
if(memList.isNotEmpty){
print('if memList ---------------------------------------------------------');
for(Member m in memList){
var scheduledTime = DateTime.now();
final timeZone = TimeZone();
String timeZoneName = await timeZone.getTimeZoneName();
final location = await timeZone.getLocation(timeZoneName);
final scheduledDate = tz.TZDateTime.from(scheduledTime, location).add(Duration(seconds: 20));
print('here ==================================================================');
// await fltrNotification.zonedSchedule(
// m.id,
// 'Subscription Notification',
// '${m.surname} ${m.firstName}\'s subscription has expired.',
// scheduledDate,
// notifDetails,
// uiLocalNotificationDateInterpretation:
// UILocalNotificationDateInterpretation.absoluteTime,
// androidAllowWhileIdle: true);
}
}
_showNotification(fltrNotification);
print('execute ___________________________________________________________');
return Future.value(true);
});
}
我必须打印检查点才能知道我的代码哪里出错了。现在我的通知看起来像这样;
推荐阅读
- java - Spring Data Cassandra 在数据库中两次插入后在 PT2S 后抛出 Query timed out
- excel - 即使 Exact 与特定引用一起使用,索引匹配和 Exact 的 Excel 结果也不起作用
- c# - ASP.NET MVC 4:尝试从输入文本框在 Sql Server 数据库中插入日期时间字段时收到错误
- c# - C# Jagged Array,确定是否有任何对匹配
- javascript - DOMException: play() 失败,因为用户没有先与文档交互(音频呼叫响铃)
- jquery - 单击具有相同班级的班级时显示和隐藏表格的最佳方式
- linux - 当进程在后台启动时,fd0 设置为什么?
- cluster-computing - Apache Ignite 2.9.0 集群发现错误
- javascript - 我想
在这张地图中插入标签() - css - 填充和边距在断点上不起作用