在 Flutter 中的预定时间显示推送通知
Display a push notification at a scheduled time in Flutter
我已经编写了下面的代码(完全 运行 可用),当我 运行 应用程序显示通知但 AlarmManager 没有按预期工作时。它不会像我告诉他的那样每分钟显示一条通知……我该如何解决?提前致谢并继续用 <3
编码
class _MyHomePageState extends State<MyHomePage>
{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
var initializationSettings;
var initializationSettingsAndroid;
@override
Widget build(BuildContext context)
{
initializationSettingsAndroid = new AndroidInitializationSettings("@mipmap/ic_launcher");
initializationSettings = InitializationSettings(initializationSettingsAndroid, null);
flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification);
createTimer();
return Scaffold
(
appBar: AppBar
(
title: Text(widget.title),
),
body: Container()
);
}
void createTimer() async
{
final int alarmID = 0;
showNotificationWithDefaultSound();
await AndroidAlarmManager.initialize();
await AndroidAlarmManager.periodic(const Duration(minutes: 1), alarmID, showNotificationWithDefaultSound);
}
Future showNotificationWithDefaultSound() async
{
var androidPlatformChannelSpecifics = new AndroidNotificationDetails('idNotification', 'AppName', 'Description', importance: Importance.Max, priority: Priority.High);
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(0, 'New Notification', 'This is the text of the notification', platformChannelSpecifics, payload: 'Hi guys and girls!!');
}
Future onSelectNotification(String payload) async
{
showDialog(context: context, builder: (_)
{
return new AlertDialog(title: Text("PayLoad"), content: Text("Payload : $payload"));
});
}
}
终于找到解决办法了...
这是完整的例子。
https://github.com/Anon-65535/SimpleBackgroundTimer
首先,使main()
"async"然后初始化AndroidAlarmManager
;
void main() async
{
WidgetsFlutterBinding.ensureInitialized();
await AndroidAlarmManager.initialize();
runApp(MainClass());
}
在你的包里面创建alarmManager.dart
,里面的class叫做NotificationManager
;
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class NotificationManager
{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
AndroidInitializationSettings initializationSettingsAndroid;
IOSInitializationSettings initializationSettingsIOS;
InitializationSettings initializationSettings;
void initNotificationManager()
{
initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');
initializationSettingsIOS = new IOSInitializationSettings();
initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
void showNotificationWithDefaultSound(String title, String body)
{
var androidPlatformChannelSpecifics = new AndroidNotificationDetails('your channel id', 'your channel name', 'your channel description', importance: Importance.Max, priority: Priority.High);
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
flutterLocalNotificationsPlugin.show(0, title, body, platformChannelSpecifics);
}
}
然后从您最喜欢的 .dart
文件中的任何 class 创建回调 (回调将从 [= 创建的后台线程调用) 15=]);
alarmCallback()
{
NotificationManager n = new NotificationManager();
n.initNotificationManager();
n.showNotificationWithDefaultSound("Prova", "Prova");
print("[*] Called from AlarmManager");
return;
}
最后以这种方式从 AlarmManager 创建后台线程(在此 .dart
文件中导入定义回调的 .dart
文件:
AndroidAlarmManager.oneShotAt(DateTime.now().add(Duration(seconds: 10)),
0,
alarmCallback,
exact: true,
allowWhileIdle: true,
wakeup: true,
rescheduleOnReboot: true,
alarmClock: true);
//This will call your callback in 10 seconds from now (Datetime.now())
用 <3
继续编码
我已经编写了下面的代码(完全 运行 可用),当我 运行 应用程序显示通知但 AlarmManager 没有按预期工作时。它不会像我告诉他的那样每分钟显示一条通知……我该如何解决?提前致谢并继续用 <3
编码class _MyHomePageState extends State<MyHomePage>
{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
var initializationSettings;
var initializationSettingsAndroid;
@override
Widget build(BuildContext context)
{
initializationSettingsAndroid = new AndroidInitializationSettings("@mipmap/ic_launcher");
initializationSettings = InitializationSettings(initializationSettingsAndroid, null);
flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification);
createTimer();
return Scaffold
(
appBar: AppBar
(
title: Text(widget.title),
),
body: Container()
);
}
void createTimer() async
{
final int alarmID = 0;
showNotificationWithDefaultSound();
await AndroidAlarmManager.initialize();
await AndroidAlarmManager.periodic(const Duration(minutes: 1), alarmID, showNotificationWithDefaultSound);
}
Future showNotificationWithDefaultSound() async
{
var androidPlatformChannelSpecifics = new AndroidNotificationDetails('idNotification', 'AppName', 'Description', importance: Importance.Max, priority: Priority.High);
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.show(0, 'New Notification', 'This is the text of the notification', platformChannelSpecifics, payload: 'Hi guys and girls!!');
}
Future onSelectNotification(String payload) async
{
showDialog(context: context, builder: (_)
{
return new AlertDialog(title: Text("PayLoad"), content: Text("Payload : $payload"));
});
}
}
终于找到解决办法了... 这是完整的例子。
https://github.com/Anon-65535/SimpleBackgroundTimer
首先,使main()
"async"然后初始化AndroidAlarmManager
;
void main() async
{
WidgetsFlutterBinding.ensureInitialized();
await AndroidAlarmManager.initialize();
runApp(MainClass());
}
在你的包里面创建alarmManager.dart
,里面的class叫做NotificationManager
;
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class NotificationManager
{
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
AndroidInitializationSettings initializationSettingsAndroid;
IOSInitializationSettings initializationSettingsIOS;
InitializationSettings initializationSettings;
void initNotificationManager()
{
initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher');
initializationSettingsIOS = new IOSInitializationSettings();
initializationSettings = new InitializationSettings(initializationSettingsAndroid, initializationSettingsIOS);
flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
void showNotificationWithDefaultSound(String title, String body)
{
var androidPlatformChannelSpecifics = new AndroidNotificationDetails('your channel id', 'your channel name', 'your channel description', importance: Importance.Max, priority: Priority.High);
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
flutterLocalNotificationsPlugin.show(0, title, body, platformChannelSpecifics);
}
}
然后从您最喜欢的 .dart
文件中的任何 class 创建回调 (回调将从 [= 创建的后台线程调用) 15=]);
alarmCallback()
{
NotificationManager n = new NotificationManager();
n.initNotificationManager();
n.showNotificationWithDefaultSound("Prova", "Prova");
print("[*] Called from AlarmManager");
return;
}
最后以这种方式从 AlarmManager 创建后台线程(在此 .dart
文件中导入定义回调的 .dart
文件:
AndroidAlarmManager.oneShotAt(DateTime.now().add(Duration(seconds: 10)),
0,
alarmCallback,
exact: true,
allowWhileIdle: true,
wakeup: true,
rescheduleOnReboot: true,
alarmClock: true);
//This will call your callback in 10 seconds from now (Datetime.now())
用 <3
继续编码