Flutter 通知:如何安排通知?

问题描述 投票:0回答:1

愿意在 Flutter 应用程序中创建计时器,但我很难获取时区中的当前时间并将通知推送到预定的延迟时间。

我想在 Flutter 中创建一个计时器,在结束时推送通知。当用户单击“启动”按钮时,应将通知安排为当前时间 + 延迟(计时器的值)。 2 个问题:

  • 如何获取我所在时区的当前时间?我尝试使用 tz.local 但收到不相关的时间。
  • 如何安排通知?我尝试使用类 **FlutterLocalNotificationsPlugin ** 及其方法 zonedSchedule,但通知从未推送?
flutter push-notification notifications
1个回答
0
投票
  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,
    );
  }
}


 
© www.soinside.com 2019 - 2024. All rights reserved.