首页 > 解决方案 > 如何在一段时间后自动获取重复出现的通知?

问题描述

我正在使用一个功能_showNotificationsAfterSecond在延迟 3 秒后获取通知。我尝试创建一个 for 循环来运行此函数 8 次,以便在每次延迟 3 秒后收到 8 条通知。按下“开始提醒”按钮(调用该功能)后,我只收到一个通知,之后什么也没有。

我究竟做错了什么?

这是我的代码:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LocalNotifications(),
    );
  }
}

class LocalNotifications extends StatefulWidget {
  @override
  _LocalNotificationsState createState() => _LocalNotificationsState();
}

class _LocalNotificationsState extends State<LocalNotifications> {
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
  FlutterLocalNotificationsPlugin();
  AndroidInitializationSettings androidInitializationSettings;
  IOSInitializationSettings iosInitializationSettings;
  InitializationSettings initializationSettings;

  @override
  void initState() {
    super.initState();
    initializing();
  }

  void initializing() async {
    androidInitializationSettings =
        AndroidInitializationSettings('mipmap/ic_launcher');
    iosInitializationSettings = IOSInitializationSettings(
        onDidReceiveLocalNotification: onDidReceiveLocalNotification);
    initializationSettings = InitializationSettings(
        androidInitializationSettings, iosInitializationSettings);
    await flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }


  void _showNotificationsAfterSecond() async {
    for( int i = 0 ; i < 8 ; i ++) {

      notificationAfterSec();
    }
  }

  Future<Null> delay(int milliseconds) {
    return new Future.delayed(new Duration(milliseconds: milliseconds));
  }

  Future<void> notificationAfterSec() async {
    var timeDelayed = DateTime.now().add(Duration(seconds: 3));
    AndroidNotificationDetails androidNotificationDetails =
    AndroidNotificationDetails(
        'second  id', 'second heading', 'second  text',
        priority: Priority.High,
        importance: Importance.Max,
        ticker: 'test');

    IOSNotificationDetails iosNotificationDetails = IOSNotificationDetails();

    NotificationDetails notificationDetails =
    NotificationDetails(androidNotificationDetails, iosNotificationDetails);
    await flutterLocalNotificationsPlugin.schedule(
        1, 'yo', 'wfqawsfqsqacqfqcwefs', timeDelayed, notificationDetails);
  }

  Future<void> turnOffNotification(
      FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) async {
    await flutterLocalNotificationsPlugin.cancelAll();
  }


  Future onSelectNotification(String payLoad) {
    if (payLoad != null) {
      print(payLoad);
    }

    // we can set navigator to navigate another screen
  }

  Future onDidReceiveLocalNotification(
      int id, String title, String body, String payload) async {
    return CupertinoAlertDialog(
      title: Text(title),
      content: Text(body),
      actions: <Widget>[
        CupertinoDialogAction(
            isDefaultAction: true,
            onPressed: () {
              print("");
            },
            child: Text("Okay")),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Hydration"),
        actions: <Widget>[
          FlatButton(

            textColor: Colors.white,
            onPressed: () {
              DialogUtils.showCustomDialog(context,
                  title: "Why should this be a priority?",
                  okBtnText: "Got It!",
                  okBtnFunction: () => Navigator.pop(context));
            },
            child: Icon(Icons.info_outline),
            shape: CircleBorder(side: BorderSide(color: Colors.transparent)),
          ),
        ],
      ),
      body: Container(
        decoration: BoxDecoration(
            image: DecorationImage(
                image: AssetImage('assets/wat.jfif'), fit: BoxFit.cover)),
        width: double.infinity,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            Container(
              padding: EdgeInsets.all(20.0),
              margin: EdgeInsets.fromLTRB(20.0, 30.0, 20.0, 0.0),
              child: Column(
                children: <Widget>[
                  Text(
                    'Water Intake Reminder',
                    style: TextStyle(color: Colors.white, fontSize: 30),
                    textAlign: TextAlign.center,
                  ),
                  Padding(
                      padding: EdgeInsets.symmetric(
                          vertical: 20.0, horizontal: 20.0)),
                  Container(
                    child: FittedBox(
                      child: Image.asset(
                        'assets/drinking.jpg',
                        width: 300,
                        height: 300,
                      ), //adjust this baad mein
                      fit: BoxFit.fill,
                    ),
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(25.0),
                    ),
                  ),
                ],
              ),
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(12.0),
                color: Colors.blueAccent[100],
              ),
              height: 400.0,
              width: 300.0,
            ),
            Padding(padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0, 8.0)),
            Padding(padding: EdgeInsets.fromLTRB(8.0, 1.0, 8.0, 1.0)),
            Row(
              children: <Widget>[
                Padding(padding: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0)),

                FloatingActionButton.extended(
                  heroTag: "btn1",
                  onPressed: _showNotificationsAfterSecond,
                  label: Text(
                    "Start Reminders",
                    style: TextStyle(fontSize: 16.0, color: Colors.white),
                  ),
                ),
                Padding(padding: EdgeInsets.fromLTRB(5.0, 5.0, 5.0, 5.0)),
                FloatingActionButton.extended(
                  heroTag: "btn2",
                  onPressed: () {
                    turnOffNotification(flutterLocalNotificationsPlugin);
                  },
                  label: Text(
                    "Stop Reminders",
                    style: TextStyle(fontSize: 16.0, color: Colors.white),
                  ),
                ),
                Padding(padding: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0)),

              ],
            ),

          ],
        ),
      ),
    );
  }
}

class DialogUtils {
  static DialogUtils _instance = new DialogUtils.internal();

  DialogUtils.internal();

  factory DialogUtils() => _instance;

  static void showCustomDialog(BuildContext context,
      {@required String title,
        String okBtnText = "hhegregrbge",
        @required Function okBtnFunction}) {
    showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            backgroundColor: Colors.deepPurpleAccent[100],
            title: Text(
              title,
              textAlign: TextAlign.center,
              style: TextStyle(color: Colors.white),
            ),
            content: Text(
              " When you're pregnant, you need more water than the average person in order to form amniotic fluid, produce extra blood, build newtissue, carry nutrients, enhance digestion, and flush out wastes and toxins.Since you need more water during pregnancy, how much is enough? It’s recommended that you drink 8-12 glasses of water a day, or 2.3 liters.",
              textAlign: TextAlign.center,
              style: TextStyle(color: Colors.white70),
            ),
            actions: <Widget>[
              FlatButton(
                child: Text(
                  okBtnText,
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: okBtnFunction,
              ),
            ],
          );
        });
  }
}

标签: flutterdart

解决方案


您可以在下面复制粘贴运行完整代码
您需要使用不同的,您可以作为计划 ID 代码片段id传递i

void _showNotificationsAfterSecond() async {
    for (int i = 0; i < 8; i++) {
      notificationAfterSec(i);
    }
  }
  
Future<void> notificationAfterSec(int id) async {
  ...
  await flutterLocalNotificationsPlugin.schedule(id, '${id} yo',
        'wfqawsfqsqacqfqcwefs', timeDelayed, notificationDetails);
        

工作演示

在此处输入图像描述

完整代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LocalNotifications(),
    );
  }
}

class LocalNotifications extends StatefulWidget {
  @override
  _LocalNotificationsState createState() => _LocalNotificationsState();
}

class _LocalNotificationsState extends State<LocalNotifications> {
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();
  AndroidInitializationSettings androidInitializationSettings;
  IOSInitializationSettings iosInitializationSettings;
  InitializationSettings initializationSettings;

  @override
  void initState() {
    super.initState();
    initializing();
  }

  void initializing() async {
    androidInitializationSettings =
        AndroidInitializationSettings('mipmap/ic_launcher');
    iosInitializationSettings = IOSInitializationSettings(
        onDidReceiveLocalNotification: onDidReceiveLocalNotification);
    initializationSettings = InitializationSettings(
        androidInitializationSettings, iosInitializationSettings);
    await flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }

  void _showNotificationsAfterSecond() async {
    for (int i = 0; i < 8; i++) {
      notificationAfterSec(i);
    }
  }

  Future<Null> delay(int milliseconds) {
    return new Future.delayed(new Duration(milliseconds: milliseconds));
  }

  Future<void> notificationAfterSec(int id) async {
    var timeDelayed = DateTime.now().add(Duration(seconds: 3));
    AndroidNotificationDetails androidNotificationDetails =
        AndroidNotificationDetails(
            'second  id', 'second heading', 'second  text',
            priority: Priority.High,
            importance: Importance.Max,
            ticker: 'test');

    IOSNotificationDetails iosNotificationDetails = IOSNotificationDetails();

    NotificationDetails notificationDetails =
        NotificationDetails(androidNotificationDetails, iosNotificationDetails);
    await flutterLocalNotificationsPlugin.schedule(id, '${id} yo',
        'wfqawsfqsqacqfqcwefs', timeDelayed, notificationDetails);
  }

  Future<void> turnOffNotification(
      FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin) async {
    await flutterLocalNotificationsPlugin.cancelAll();
  }

  Future onSelectNotification(String payLoad) {
    if (payLoad != null) {
      print(payLoad);
    }

    // we can set navigator to navigate another screen
  }

  Future onDidReceiveLocalNotification(
      int id, String title, String body, String payload) async {
    return CupertinoAlertDialog(
      title: Text(title),
      content: Text(body),
      actions: <Widget>[
        CupertinoDialogAction(
            isDefaultAction: true,
            onPressed: () {
              print("");
            },
            child: Text("Okay")),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Hydration"),
        actions: <Widget>[
          FlatButton(
            textColor: Colors.white,
            onPressed: () {
              DialogUtils.showCustomDialog(context,
                  title: "Why should this be a priority?",
                  okBtnText: "Got It!",
                  okBtnFunction: () => Navigator.pop(context));
            },
            child: Icon(Icons.info_outline),
            shape: CircleBorder(side: BorderSide(color: Colors.transparent)),
          ),
        ],
      ),
      body: Container(
        decoration: BoxDecoration(
            image: DecorationImage(
                image: NetworkImage('https://picsum.photos/250?image=9'),
                fit: BoxFit.cover)),
        width: double.infinity,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: <Widget>[
            Container(
              padding: EdgeInsets.all(20.0),
              margin: EdgeInsets.fromLTRB(20.0, 30.0, 20.0, 0.0),
              child: Column(
                children: <Widget>[
                  Text(
                    'Water Intake Reminder',
                    style: TextStyle(color: Colors.white, fontSize: 30),
                    textAlign: TextAlign.center,
                  ),
                  Padding(
                      padding: EdgeInsets.symmetric(
                          vertical: 20.0, horizontal: 20.0)),
                  Container(
                    child: FittedBox(
                      child: Image.network(
                        'https://picsum.photos/250?image=9',
                        width: 300,
                        height: 300,
                      ), //adjust this baad mein
                      fit: BoxFit.fill,
                    ),
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(25.0),
                    ),
                  ),
                ],
              ),
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(12.0),
                color: Colors.blueAccent[100],
              ),
              height: 400.0,
              width: 300.0,
            ),
            Padding(padding: EdgeInsets.fromLTRB(8.0, 20.0, 8.0, 8.0)),
            Padding(padding: EdgeInsets.fromLTRB(8.0, 1.0, 8.0, 1.0)),
            Row(
              children: <Widget>[
                Padding(padding: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0)),
                FloatingActionButton.extended(
                  heroTag: "btn1",
                  onPressed: _showNotificationsAfterSecond,
                  label: Text(
                    "Start Reminders",
                    style: TextStyle(fontSize: 16.0, color: Colors.white),
                  ),
                ),
                Padding(padding: EdgeInsets.fromLTRB(5.0, 5.0, 5.0, 5.0)),
                FloatingActionButton.extended(
                  heroTag: "btn2",
                  onPressed: () {
                    turnOffNotification(flutterLocalNotificationsPlugin);
                  },
                  label: Text(
                    "Stop Reminders",
                    style: TextStyle(fontSize: 16.0, color: Colors.white),
                  ),
                ),
                Padding(padding: EdgeInsets.fromLTRB(9.0, 9.0, 9.0, 9.0)),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

class DialogUtils {
  static DialogUtils _instance = new DialogUtils.internal();

  DialogUtils.internal();

  factory DialogUtils() => _instance;

  static void showCustomDialog(BuildContext context,
      {@required String title,
      String okBtnText = "hhegregrbge",
      @required Function okBtnFunction}) {
    showDialog(
        context: context,
        builder: (_) {
          return AlertDialog(
            backgroundColor: Colors.deepPurpleAccent[100],
            title: Text(
              title,
              textAlign: TextAlign.center,
              style: TextStyle(color: Colors.white),
            ),
            content: Text(
              " When you're pregnant, you need more water than the average person in order to form amniotic fluid, produce extra blood, build newtissue, carry nutrients, enhance digestion, and flush out wastes and toxins.Since you need more water during pregnancy, how much is enough? It’s recommended that you drink 8-12 glasses of water a day, or 2.3 liters.",
              textAlign: TextAlign.center,
              style: TextStyle(color: Colors.white70),
            ),
            actions: <Widget>[
              FlatButton(
                child: Text(
                  okBtnText,
                  style: TextStyle(color: Colors.white),
                ),
                onPressed: okBtnFunction,
              ),
            ],
          );
        });
  }
}

推荐阅读