如何在通知到达时在任何屏幕上显示自定义对话框?

Posted

技术标签:

【中文标题】如何在通知到达时在任何屏幕上显示自定义对话框?【英文标题】:How to show a custom dialog in any screen in when notification arrived flutter? 【发布时间】:2019-12-07 13:12:13 【问题描述】:

当推送通知到达我的应用程序时,我试图在任何活动屏幕中显示一个对话框。在应用程序运行时。我可以通过用户交互显示对话框,例如单击按钮。但我想在没有用户交互的情况下展示它。如果有通知到达,则仅应触发对话。我正在尝试使用后台获取来调用它。但找不到任何解决方案。所以,请帮助并提前感谢您。

【问题讨论】:

【参考方案1】:

我之前遇到过同样的问题,我会展示我的解决方案,希望它适合你

解决方案的主要内容:我们的页面没有弹出 当应用程序像主页一样生活时导航器堆栈,因此我们可以使用此页面中的 BuildContext

所以通过 context 我的 StatefulWidget(Like Home Page) 谁 必须仍然在 Navigator 的堆栈中(当应用程序运行时不弹出它)给你的类来处理通知数据,你可以用它来显示对话框

现在写一些代码:

例如,我们有 NotificationManger 类,该类用于使用 static 方法处理通知消息

class NotificationManger 
    
   static BuildContext _context;


    
   static init(@required BuildContext context) 
    _context = context;
    
  

 //this method used when notification come and app is closed or in background and 
 // user click on it, i will left it empty for you
 static handleDataMsg(Map<String, dynamic> data)

 

 //this our method called when notification come and app is foreground
 static handleNotificationMsg(Map<String, dynamic> message) 
    debugPrint("from mangger  $message");

    final dynamic data = message['data'];
    //as ex we have some data json for every notification to know how to handle that
    //let say showDialog here so fire some action 
    if (data.containsKey('showDialog')) 
      // Handle data message with dialog
      _showDialog(data);
    
  


   static _showDialog(@required Map<String, dynamic> data) 

    
        //you can use data map also to know what must show in MyDialog
        showDialog(context: _context,builder: (_) =>MyDialog());


  


现在我们在我的应用程序的类 FCM 中将此回调作为***或静态(必须是其中之一)

class Fcm 
  static final FirebaseMessaging _fcm = FirebaseMessaging();

  static initConfigure() 
    if (Platform.isios) _iosPermission();

    _fcm.requestNotificationPermissions();
    _fcm.autoInitEnabled();

    _fcm.configure(
        onMessage: (Map<String, dynamic> message) async =>
            NotificationManger.handleNotificationMsg(message),
        onLaunch: (Map<String, dynamic> message) async =>
            NotificationManger.handleDataMsg(message['data']),
        onResume: (Map<String, dynamic> message) async =>
            NotificationManger.handleDataMsg(message['data']),
        onBackgroundMessage: async =>
            NotificationManger.handleDataMsg(message['data']);


  

  static _iosPermission() 
    _fcm.requestNotificationPermissions(
        IosNotificationSettings(sound: true, badge: true, alert: true));
    _fcm.onIosSettingsRegistered.listen((IosNotificationSettings settings) 
      print("Settings registered: $settings");
    );
  


更多关于回调 fcm 的信息请阅读this

现在在我们的 HomePage 状态中很好地在 initState 方法中初始化我们的类

 @override
  void initState() 
    super.initState();
  

    Future.delayed(Duration.zero,()
      ///init Notification Manger
      NotificationManger.init(context: context);

      ///init FCM Configure
      Fcm.initConfigure();

     
    );


  

如前所述,当应用程序显示时主页不会弹出,您可以启动另一个页面但不关闭主页

希望对你有帮助

【讨论】:

我爱你,兄弟。如果你是个女孩,我会嫁给你。非常感谢您的解决方案。 @JayantDhingra hhhhh 对不起兄弟我是个男人,祝婚姻好运在另一个答案中:P @JayantDhingra 我没有看到对话框,谁能告诉我该怎么做? @MahmoudAbuElheja 感谢您的出色回答!设备锁定时是否可以显示此对话框?

以上是关于如何在通知到达时在任何屏幕上显示自定义对话框?的主要内容,如果未能解决你的问题,请参考以下文章

到达屏幕结束时在 UITableView 自定义单元格中包装文本(Swift)

单击推送通知后,当应用程序进入前台时如何显示自定义对话框

如何在锁定屏幕上显示 gcm 推送通知?

屏幕锁定时如何通知推送通知?

如何确定自定义 UICollectionViewCell 何时在屏幕上显示为 100%

在推送/本地通知右侧显示自定义图像?