[英]How to dismiss local notification in flutter without bring app in foreground
我正在使用awesome_notifications并希望在通知中单击“标记为已读”时关闭应用程序,而不是将应用程序置于前台。
应用程序正确地不会将应用程序置于前台,但不会关闭通知。
下面是代码
import 'package:awesome_notifications/awesome_notifications.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
AwesomeNotifications().initialize(
null,
[
NotificationChannel(
channelKey: 'basic_channel',
channelName: 'Basic notifications',
channelDescription: 'Notification channel for basic tests',
// defaultColor: Color(0xFF9D50DD),
// ledColor: Colors.white
)
],
debug: false);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
AwesomeNotifications().createNotification(
content: NotificationContent(
id: 10,
channelKey: 'basic_channel',
title: 'Simple Notification',
body: 'Simple body',
payload: {'uuid': 'user-profile-uuid'}),
actionButtons: [
NotificationActionButton(
key: 'READ',
label: 'Mark as read',
autoCancel: true,
buttonType: ActionButtonType.DisabledAction),
NotificationActionButton(
key: 'PROFILE',
label: 'Show Profile',
autoCancel: false,
enabled: true,
buttonType: ActionButtonType.Default)
]);
}
@override
void initState() {
super.initState();
AwesomeNotifications().isNotificationAllowed().then((isAllowed) {
if (!isAllowed) {
AwesomeNotifications().requestPermissionToSendNotifications();
}
});
AwesomeNotifications().actionStream.listen((receivedNotification) {
debugPrint(
" actionStream received " + receivedNotification.toString());
});
AwesomeNotifications().createdStream.listen((receivedNotification) {
debugPrint(
" createdStream received " + receivedNotification.toString());
});
AwesomeNotifications().displayedStream.listen((receivedNotification) {
debugPrint(
" displayedStream received " + receivedNotification.toString());
});
AwesomeNotifications().dismissedStream.listen((receivedNotification) {
debugPrint(
" dismissedStream received " + receivedNotification.toString());
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
//
title: Text(widget.title),
),
body: Center(
//
child: Column(
//
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
由于“标记为已读”的 buttonType 是 ActionButtonType.DisabledAction 它正确地不会将应用程序置于前台(要求之一),但“解除”的第二个要求(即通知被清除,没有发生并且通知是停留。如何同时清除通知?
根据文档,您的代码是正确的。 ActionButtonType.DisabledAction应该从托盘中删除通知。 但它没有(即使在示例应用程序中)。 我认为这是一个错误。 您可以创建 GitHub 问题并请求修复。 还有一件事, AwesomeNotifications().dismiss(id)删除通知。 但是 Awesome Notification 不支持自定义操作。 所以,我认为你必须等待修复。
据我所知,隐藏通知是不可能的,如果它在前台,至少如果不做一些“技巧”这是不可能的。
我认为这段代码可以帮助你
int id=Random().nextInt(1000);
await NotificationHandler.flutterLocalNotificationPlugin.show(
id, title, body, platform,
payload: 'my payload');
await NotificationHandler.flutterLocalNotificationPlugin.cancel(id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.