繁体   English   中英

如何在不将应用程序置于前台的情况下关闭 flutter 中的本地通知

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM