flutter - 如何在一段时间后自动获取重复出现的通知?
问题描述
我正在使用一个功能_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,
),
],
);
});
}
}
解决方案
您可以在下面复制粘贴运行完整代码
您需要使用不同的,您可以作为计划 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,
),
],
);
});
}
}
推荐阅读
- reactjs - React Material UI Tabs with Router Link Active 选项卡在第二次点击时出现
- python-3.x - Python manage.py runserver 没有响应
- flutter - 如何在flutter中分配primarySwatch中的十六进制颜色代码?
- java - 在 android/java 应用程序中测试加密功能的性能(按时间测量)的最佳方法?
- java - Spring Boot中没有存储库的多个mongo
- c# - 对内存数据使用 SQL
- git - 我可以在不使用 SSH 密钥的情况下使用 git 部署到 GitHub 吗?
- http-status-code-404 - 如何在 shopify 上修复 /a/downloads/ 404?
- html - 根据用户 ID 显示图像
- python-3.x - 我想为 AB 1111、AB 1111、ABC 1111 和 AB 1111 创建一个通用的正则表达式函数