Flutter:预定的通知日期时间
Flutter: Scheduled notification datetime
我希望将 Flutter 的插件 date_time_picker 与本地通知集成。
所以当我 select 一个日期和时间时,我也会安排一个通知。
这是我的代码..你能帮我吗?现在我没有任何错误,但代码不工作。
class test1 extends StatefulWidget {
@override
_test1State createState() => _test1State();
}
class _test1State extends State {
FlutterLocalNotificationsPlugin fltrNotification;
String _selectedParam;
String task;
int val;
@override
void initState() {
super.initState();
var androidInitilize =
new AndroidInitializationSettings('icon_notification');
var iOSinitilize = new IOSInitializationSettings();
var initilizationsSettings = new InitializationSettings(
android: androidInitilize, iOS: iOSinitilize);
fltrNotification = new FlutterLocalNotificationsPlugin();
fltrNotification.initialize(initilizationsSettings,
onSelectNotification: notificationSelected);
}
Future scheuleAtParticularTime(DateTime timee) async {
// var time = DateTime(timee.day, timee.month, timee.year, timee.hour,
// timee.minute, timee.second);
var time =
DateTime(timee.year, timee.month, timee.day, timee.hour, timee.minute);
var scheduledNotificationDateTime =
new DateTime.now().add(new Duration(seconds: 5));
var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
'your other channel id',
'your other channel name',
'your other channel description');
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
NotificationDetails platformChannelSpecifics = new NotificationDetails(
android: androidPlatformChannelSpecifics,
iOS: iOSPlatformChannelSpecifics);
// tz.initializeTimeZones();
// tz.setLocalLocation(tz.getLocation('Italy'));
await fltrNotification.schedule(1, 'scheduled title', 'scheduled body',
scheduledNotificationDateTime, platformChannelSpecifics);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FlatButton(
onPressed: () {
DatePicker.showDateTimePicker(context, showTitleActions: true,
onChanged: (date) {
print('change $date');
}, onConfirm: (date) {
print('confirm $date');
scheuleAtParticularTime(DateTime.fromMillisecondsSinceEpoch(
date.millisecondsSinceEpoch));
}, currentTime: DateTime.now(), locale: LocaleType.it);
},
child: Text(
'Select time for notification arrival',
style:
TextStyle(color: Colors.black, fontWeight: FontWeight.w900),
),
),
],
),
),
);
}
Future notificationSelected(String payload) async {
showDialog(
context: context,
builder: (context) => AlertDialog(
content: Text("Notification Clicked $payload"),
),
);
}
}
谢谢!
ps..我插入了完整的代码,通知有效但随机时间(我从选择器中设置它后大约 5 秒)
假设您已经配置了 AndroidManifest.xml 文件,这是为 Android 设置插件(IOS 没有什么不同),请注意这是针对 3.0 版的。 flutter_local_notifications 的 0 个(我检查时的最新版本)。
首先是帮手 class :
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/timezone.dart' as tz;
class NotificationsHelper {
static final _flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
//needs an icon
static final _initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
static final _initializationSettings =
InitializationSettings(android: _initializationSettingsAndroid);
static Future<void> init() async {
await _flutterLocalNotificationsPlugin.initialize(_initializationSettings);
tz.initializeDatabase([]);
}
static final _androidNotificationDetails = AndroidNotificationDetails(
'channel id',
'channel name',
'channel description',
importance: Importance.max,
priority: Priority.high,
);
static final _notificationDetails =
NotificationDetails(android: _androidNotificationDetails);
// set Notification methoud
static Future<void> setNotification(DateTime dateTime, int id) async {
await _flutterLocalNotificationsPlugin.zonedSchedule(
id,
'scheduled title',
'scheduled body',
tz.TZDateTime(tz.local, dateTime.year, dateTime.month, dateTime.hour,
dateTime.minute),
_notificationDetails,
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime,
);
}
// cancel Notification methoud
static Future<void> cancelNotification(int id) async {
await _flutterLocalNotificationsPlugin.cancel(id);
}
}
AndroidInitializationSettings
需要一个图标,它应该在 android\app\src\main\res\drawable
文件夹中,在可能的情况下,图标名称是 app_icon.png。
主函数中的第二个:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await NotificationsHelper.init();
runApp(MyApp());
}
这将初始化插件。
现在,您可以在应用的任何位置调用 NotificationsHelper.setNotification()
来设置通知或 NotificationsHelper.cancelNotification()
来取消通知。
ID 应该是唯一的,因为您不能有 2 个或更多具有相同 ID 的预定通知,您添加的最后一个通知将替换旧的。
好的,我找到问题了:
await fltrNotification.schedule(1, 'scheduled title', 'scheduled body', timee, platformChannelSpecifics);
而不是
await fltrNotification.schedule(1, 'scheduled title', 'scheduled body',
scheduledNotificationDateTime, platformChannelSpecifics);
您可以使用内置的 class 来安排带有日期和时间的通知。您可以查看以下代码以更好地理解。
Future<void> scheduleNotification() async {
var scheduledNotificationDateTime =
DateTime(2021,10,11,1,17,0); //Here you can set your custom Date&Time
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'channel id',
'channel name',
'channel description',
icon: 'flutter_devs',
largeIcon: DrawableResourceAndroidBitmap('flutter_devs'),
);
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.schedule(
0,
'scheduled title',
'scheduled body',
scheduledNotificationDateTime,
platformChannelSpecifics);
}
我希望将 Flutter 的插件 date_time_picker 与本地通知集成。
所以当我 select 一个日期和时间时,我也会安排一个通知。
这是我的代码..你能帮我吗?现在我没有任何错误,但代码不工作。
class test1 extends StatefulWidget {
@override
_test1State createState() => _test1State();
}
class _test1State extends State {
FlutterLocalNotificationsPlugin fltrNotification;
String _selectedParam;
String task;
int val;
@override
void initState() {
super.initState();
var androidInitilize =
new AndroidInitializationSettings('icon_notification');
var iOSinitilize = new IOSInitializationSettings();
var initilizationsSettings = new InitializationSettings(
android: androidInitilize, iOS: iOSinitilize);
fltrNotification = new FlutterLocalNotificationsPlugin();
fltrNotification.initialize(initilizationsSettings,
onSelectNotification: notificationSelected);
}
Future scheuleAtParticularTime(DateTime timee) async {
// var time = DateTime(timee.day, timee.month, timee.year, timee.hour,
// timee.minute, timee.second);
var time =
DateTime(timee.year, timee.month, timee.day, timee.hour, timee.minute);
var scheduledNotificationDateTime =
new DateTime.now().add(new Duration(seconds: 5));
var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
'your other channel id',
'your other channel name',
'your other channel description');
var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
NotificationDetails platformChannelSpecifics = new NotificationDetails(
android: androidPlatformChannelSpecifics,
iOS: iOSPlatformChannelSpecifics);
// tz.initializeTimeZones();
// tz.setLocalLocation(tz.getLocation('Italy'));
await fltrNotification.schedule(1, 'scheduled title', 'scheduled body',
scheduledNotificationDateTime, platformChannelSpecifics);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FlatButton(
onPressed: () {
DatePicker.showDateTimePicker(context, showTitleActions: true,
onChanged: (date) {
print('change $date');
}, onConfirm: (date) {
print('confirm $date');
scheuleAtParticularTime(DateTime.fromMillisecondsSinceEpoch(
date.millisecondsSinceEpoch));
}, currentTime: DateTime.now(), locale: LocaleType.it);
},
child: Text(
'Select time for notification arrival',
style:
TextStyle(color: Colors.black, fontWeight: FontWeight.w900),
),
),
],
),
),
);
}
Future notificationSelected(String payload) async {
showDialog(
context: context,
builder: (context) => AlertDialog(
content: Text("Notification Clicked $payload"),
),
);
}
}
谢谢!
ps..我插入了完整的代码,通知有效但随机时间(我从选择器中设置它后大约 5 秒)
假设您已经配置了 AndroidManifest.xml 文件,这是为 Android 设置插件(IOS 没有什么不同),请注意这是针对 3.0 版的。 flutter_local_notifications 的 0 个(我检查时的最新版本)。
首先是帮手 class :
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/timezone.dart' as tz;
class NotificationsHelper {
static final _flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
//needs an icon
static final _initializationSettingsAndroid =
AndroidInitializationSettings('app_icon');
static final _initializationSettings =
InitializationSettings(android: _initializationSettingsAndroid);
static Future<void> init() async {
await _flutterLocalNotificationsPlugin.initialize(_initializationSettings);
tz.initializeDatabase([]);
}
static final _androidNotificationDetails = AndroidNotificationDetails(
'channel id',
'channel name',
'channel description',
importance: Importance.max,
priority: Priority.high,
);
static final _notificationDetails =
NotificationDetails(android: _androidNotificationDetails);
// set Notification methoud
static Future<void> setNotification(DateTime dateTime, int id) async {
await _flutterLocalNotificationsPlugin.zonedSchedule(
id,
'scheduled title',
'scheduled body',
tz.TZDateTime(tz.local, dateTime.year, dateTime.month, dateTime.hour,
dateTime.minute),
_notificationDetails,
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime,
);
}
// cancel Notification methoud
static Future<void> cancelNotification(int id) async {
await _flutterLocalNotificationsPlugin.cancel(id);
}
}
AndroidInitializationSettings
需要一个图标,它应该在 android\app\src\main\res\drawable
文件夹中,在可能的情况下,图标名称是 app_icon.png。
主函数中的第二个:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await NotificationsHelper.init();
runApp(MyApp());
}
这将初始化插件。
现在,您可以在应用的任何位置调用 NotificationsHelper.setNotification()
来设置通知或 NotificationsHelper.cancelNotification()
来取消通知。
ID 应该是唯一的,因为您不能有 2 个或更多具有相同 ID 的预定通知,您添加的最后一个通知将替换旧的。
好的,我找到问题了:
await fltrNotification.schedule(1, 'scheduled title', 'scheduled body', timee, platformChannelSpecifics);
而不是
await fltrNotification.schedule(1, 'scheduled title', 'scheduled body',
scheduledNotificationDateTime, platformChannelSpecifics);
您可以使用内置的 class 来安排带有日期和时间的通知。您可以查看以下代码以更好地理解。
Future<void> scheduleNotification() async {
var scheduledNotificationDateTime =
DateTime(2021,10,11,1,17,0); //Here you can set your custom Date&Time
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'channel id',
'channel name',
'channel description',
icon: 'flutter_devs',
largeIcon: DrawableResourceAndroidBitmap('flutter_devs'),
);
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.schedule(
0,
'scheduled title',
'scheduled body',
scheduledNotificationDateTime,
platformChannelSpecifics);
}