【问题标题】:How to open Flutter app from background using FCM + data message?如何使用 FCM + 数据消息从后台打开 Flutter 应用程序?
【发布时间】:2020-04-01 05:34:49
【问题描述】:

我已经在我的应用程序中实现了 Google FCM,并成功接收了所有 4 个消息处理程序(onMessage、onLaunch、onResume 和 onBackground)上的消息。我的主要功能是导航到应用程序的特定屏幕。我使用 NavigatorState 键实现了这一点,它适用于除 onBackground 之外的 4 个处理程序中的 3 个。当我向我的应用程序发送数据消息时,onBackground 被触发,当它尝试导航到特定屏幕时,我收到此错误:

I/flutter (17050):NoSuchMethodError:方法 'push' 在 null 上被调用。

I/flutter (17050):接收器:null

I/flutter (17050):尝试调用:push(Instance of 'MaterialPageRoute')

我的主要问题是,除了 Navigator.of(context) 或 GlobalKey(NavigatorState) 之外,还有其他方法可以导航到屏幕,即使在最小化应用程序后仍保留应用程序的导航状态?

【问题讨论】:

    标签: android ios flutter flutter-layout


    【解决方案1】:

    您只需在通知负载中添加一些变量,以确定您希望应用导航到的位置,然后在 onResumeonLaunch 中检查它,如下所示

    onResume: (Map<String, dynamic> message) async {
    
    String type = message['data']['type'];
    
            if(type != null){
              if(type == 'chat'){
                Navigator.push(context, MaterialPageRoute(builder: (context)=> YourPageRoute()));
    
              }
         }
    }
    
    
    
    
    onLaunch: (Map<String, dynamic> message) async {
    
    String type = message['data']['type'];
    
            if(type != null){
              if(type == 'chat'){
                Navigator.push(context, MaterialPageRoute(builder: (context)=> YourPageRoute()));
              }
        }
    }
    

    【讨论】:

    • 嗨,感谢您的快速回复,我的主要问题是“onBackgroundMessage”处理程序,如果我尝试从该处理程序导航,它会给出与我的问题相同的错误(“push call on null")。有什么方法可以从这里导航吗?示例:VoIP 应用程序实现的呼叫屏幕。
    • 我在上面发布的答案在前台和后台都适用于 FCM,我没有考虑其他案例,但对于其余案例,请随意提供其他答案。
    【解决方案2】:

    我知道这是一个迟到的回复,但根据 Flutter 文档,您只能执行 HTTP 请求和 I/O 操作(例如读取和写入数据库)。原因是 onBackgroundMessage 是一个孤立的函数,这意味着你不能在类中调用函数和变量。

    我也被困在这个问题上,最近才在文档中发现。

    提醒自己,先阅读文档!

    https://firebase.flutter.dev/docs/messaging/overview/

    【讨论】:

    • 我明白了,目前唯一的解决办法是实现原生代码并在 Android 中实现服务,但这违背了目的。
    • 我现在使用的一种方法是使用远程通知来通知我的应用程序进行更新,然后使用它来触发本地通知。您实际上可以使用导航器推送来获取本地通知。 pub.dev/packages/flutter_local_notifications
    猜你喜欢
    • 2020-08-26
    • 2017-05-31
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2020-07-21
    • 2017-05-18
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多