Flutter:预定的通知日期时间

2023-12-05

我正在寻找将 Flutter 的插件 date_time_picker 与本地通知集成。

因此,当我选择日期时间时,我还会安排通知。

这是我的代码..你能帮我吗?现在我没有任何错误,但代码不起作用。

 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"),
      ),
    );
  }
}

Thanks!

ps..我已经插入了完整的代码,通知可以工作,但是是在随机时间(在我从选择器设置它后大约 5 秒)


假设您已经配置了 AndroidManifest.xml 文件,这是用于设置 Android 插件的(IOS 没有那么不同),请注意,这是 flutter_local_notifications 的 3.0.0 版本(我检查时的最后一个版本)。

首先是助手类:

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);
  }
}

The 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 的计划通知,您添加的最后一个通知将替换旧的通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:预定的通知日期时间 的相关文章

随机推荐