愿意在 Flutter 应用程序中创建计时器,但我很难获取时区中的当前时间并将通知推送到预定的延迟时间。
我想在 Flutter 中创建一个计时器,在结束时推送通知。当用户单击“启动”按钮时,应将通知安排为当前时间 + 延迟(计时器的值)。 2 个问题:
Here one example of scheduled notification:
Use this package: flutter_local_notifications: ^16.2.0
flutter_timezone: ^1.0.8
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import 'package:flutter/material.dart';
import'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:notification/local_notification.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
tz.initializeTimeZones();
NotificationHelper.initializeNotifications();
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
),
);
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Local Notification'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
NotificationHelper.notificationHelper.scheduleNotification();
},
child:
const Text('ScheduleNotification Notification for10Second'),
),
],
),
),
);
}
}
class NotificationHelper {
NotificationHelper._();
static final NotificationHelper notificationHelper =
NotificationHelper._();
static final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin=
FlutterLocalNotificationsPlugin();
static initializeNotifications() async {
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('mipmap/ic_launcher');
const DarwinInitializationSettings initializationSettingsDarwin =
DarwinInitializationSettings();
const LinuxInitializationSettings initializationSettingsLinux =
LinuxInitializationSettings(defaultActionName: 'Open notification');
const InitializationSettings initializationSettings =
InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin,
macOS: initializationSettingsDarwin,
linux: initializationSettingsLinux,
);
Future<void> notificationTapBackground(
NotificationResponse notificationResponse) async {
// notificationResponse.payload;
// handle action
}
await flutterLocalNotificationsPlugin.initialize(
initializationSettings,
// onDidReceiveBackgroundNotificationResponse: notificationTapBackground,
onDidReceiveNotificationResponse: onDidReceiveNotificationResponse,
);
}
static void onDidReceiveNotificationResponse(
NotificationResponse notificationResponse) async {
final String? payload = notificationResponse.payload;
if (notificationResponse.payload != null) {
// print(payload);
}
}
Future<void> scheduleNotification() async {
tz.initializeTimeZones();
AndroidNotificationDetails androidPlatformChannelSpecifics =
const AndroidNotificationDetails(
'channel id',
'channel name',
channelDescription: 'channel description',
icon: 'mipmap/ic_launcher',
largeIcon: DrawableResourceAndroidBitmap('mipmap/ic_launcher'),
priority: Priority.high,
importance: Importance.max,
);
DarwinNotificationDetails iOSPlatformChannelSpecifics =
const DarwinNotificationDetails(
sound: 'default.wav',
presentAlert: true,
presentBadge: true,
presentSound: true,
);
NotificationDetails platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
iOS: iOSPlatformChannelSpecifics,
);
await flutterLocalNotificationsPlugin.zonedSchedule(
0,
'Title of Notification',
'Body of Notification',
tz.TZDateTime.now(tz.local).add(const Duration(seconds: 10)),
platformChannelSpecifics,
payload: 'Custom_Sound',
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime,
androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle,
);
}
}