【问题标题】:How to add TimeOfDay to local notification in flutter?如何在颤动中将 TimeOfDay 添加到本地通知?
【发布时间】:2021-08-30 10:27:36
【问题描述】:

我希望在最终用户使用时间选择器选择它的特定时间显示通知。我对如何做到这一点的过程感到困惑。请指导我解决这个问题。

从模型中获取变量:

late var selectedTime = TimeOfDay.now();

用户从前端选择时间:

Future<Null> selectTime (BuildContext context) async{
    picked =  (await showTimePicker(
      context: context,
      initialTime: model.selectedTime,

    ))!;

    if (picked != null){
      setState(() {
        model.selectedTime = picked;
        this.preferences?.setString("dateValue", model.selectedTime.format(context));
      });
    }

  }
Widget build(BuildContext context) {
    return Scaffold(
resizeToAvoidBottomInset: false,
      body: Container(
             child: GestureDetector(
                      onTap: (){
                                  selectTime(context);
                                },
                                child: Text(
                                  '${this.preferences?.getString("dateValue") ?? model.defaultTime.format(context)}',
                                ),
                              ),

这个类单独包含通知。

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
final mymodel = myModel();
Future<void> firstNotifications() async{
  var initializationSettingsAndroid =
  AndroidInitializationSettings('@mipmap/ic_launcher');
  var initializationSettings = InitializationSettings(
      android: initializationSettingsAndroid);
  flutterLocalNotificationsPlugin.initialize(initializationSettings);

  const AndroidNotificationDetails firstNotificationSpecifics =
  AndroidNotificationDetails(
    'channel id',
    'channel name',
    'channel description',
    sound: RawResourceAndroidNotificationSound('song1'),
    playSound: true,
    enableVibration: false ,
    visibility: NotificationVisibility.secret,
    autoCancel: true,
    timeoutAfter:7000
  );

  const NotificationDetails firstNotificationPlatformSpecifics =
  NotificationDetails(android: firstNotificationSpecifics);
  await flutterLocalNotificationsPlugin.zonedSchedule
    (1, null, null, tz.TZDateTime.now(tz.local).add(Duration(seconds: 5)), firstNotificationPlatformSpecifics,
      uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
      androidAllowWhileIdle: true);
}

但是现在这个代码在我手动给出的 5 秒后播放通知。但我希望在用户选择的时间显示通知。

【问题讨论】:

    标签: android flutter dart flutter-dependencies dart-pub


    【解决方案1】:

    选择时间后需要调用 setNotification 函数

    Future<Null> selectTime (BuildContext context) async{
        picked =  (await showTimePicker(
          context: context,
          initialTime: model.selectedTime,
    
        ))!;
    
        if (picked != null){
          setState(() {
            model.selectedTime = picked;
    setNotification(picked);//Call it here
            this.preferences?.setString("dateValue", model.selectedTime.format(context));
          });
        }
    
      }
      void setNotification( TimeOfDay selectedTime) {
        final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
            FlutterLocalNotificationsPlugin();
        // final mymodel = myModel();
        Future<void> firstNotifications() async {
          var initializationSettingsAndroid =
              AndroidInitializationSettings('@mipmap/ic_launcher');
          var initializationSettings =
              InitializationSettings(android: initializationSettingsAndroid);
          flutterLocalNotificationsPlugin.initialize(initializationSettings);
    
          const AndroidNotificationDetails firstNotificationSpecifics =
              AndroidNotificationDetails(
                  'channel id', 'channel name', 'channel description',
                  sound: RawResourceAndroidNotificationSound('song1'),
                  playSound: true,
                  enableVibration: false,
                  visibility: NotificationVisibility.secret,
                  autoCancel: true,
                  timeoutAfter: 7000);
    
          const NotificationDetails firstNotificationPlatformSpecifics =
              NotificationDetails(android: firstNotificationSpecifics);
    
              tz.TZDateTime zonedTime = tz.TZDateTime.local(DateTime.now().year,DateTime.now().month,DateTime.now().day,selectedTime.hour,
                              selectedTime.minute).subtract(DateTime.now().timeZoneOffset);
    
          await flutterLocalNotificationsPlugin.zonedSchedule(
              1,
              null,
              null,
              tz.TZDateTime.now(tz.local) ,
              firstNotificationPlatformSpecifics,
              uiLocalNotificationDateInterpretation:
                  UILocalNotificationDateInterpretation.absoluteTime,
              androidAllowWhileIdle: true);
        }
      }
    

    【讨论】:

    • 非常感谢您的回复。但是你能解释一下我如何从另一个屏幕调用这个函数吗?基本上在按下按钮后会显示通知,所以目前我调用了 firstNotifications() 之类的函数。但是现在既然我们正在传递参数,我应该如何从另一个屏幕调用它?
    • 您可以在另一个类中添加该函数并将其设为静态并调用它例如:NotificationManager.setNotification(piked)
    • 在此代码下GestureDetector( onTap: () async{ await NotificationManager.setNotification(piked);} 我需要这样调用吗?
    • 不幸的是,当我按下按钮时它不起作用。
    • 因为我从另一个屏幕调用它说“LateInitializationError: Field 'picked' has not been initialized.”
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2021-09-20
    • 2021-08-11
    • 1970-01-01
    • 2021-04-11
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多