接收来自 Firebase 的消息

Posted

技术标签:

【中文标题】接收来自 Firebase 的消息【英文标题】:Recieving a message from Firebase 【发布时间】:2020-05-03 14:38:03 【问题描述】:

我正在制作一个简单的应用程序,它使用 WebView 小部件作为它的主要小部件。我希望能够从 firebase 控制台向 所有 用户发送通知。该应用程序没有身份验证

我的 MessageHandler(在 main.dart 中定义)

class MessageHandler extends StatefulWidget 
    @override
    _MessageHandlerState createState() => _MessageHandlerState();
    
class _MessageHandlerState extends State<MessageHandler>
    final FirebaseMessaging _fcm = FirebaseMessaging();
    @override
void initState()
    super.initState();
    _fcm.configure(
  onMessage: (Map<String, dynamic> message) async 
    print("here");
    print("onMessage: $message");
    final snackbar = SnackBar(
      content: Text(message['notification']['title']),
    );
  ,
 );

主要

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
   // This widget is the root of your application.
   @override
   Widget build(BuildContext context) 
     return MaterialApp(
       title: "Simple App",
  home: WebViewer()
);


WebViewer 小部件有效,所以我没有将它添加到问题中。 在 Firebase 控制台上,消息似乎已发送

但警报不会出现在 android 模拟器上,snackbar 也不会出现。

网络视图

class WebViewer extends StatelessWidget 
   final Completer<WebViewController> _controller = Completer<WebViewController>();
  //FirebaseMessaging _firebaseMessaging = new FirebaseMessaging();

  @override
  Widget build(BuildContext context) 
     return Scaffold(
        appBar: AppBar(
          title: Center(child: Text("Event Viewer")),
    ),
    body: WebView(
      initialUrl: "https://google.com",
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController webViewController)
        _controller.complete(webViewController);
      ,
    )
);

【问题讨论】:

你在哪里访问webViewer 中的消息处理程序?打印也没有出现? @PeterHaddad 打印没有出现,我将编辑问题以添加该代码。 Firebase 通知不适用于模拟器。 【参考方案1】:

为了显示snackbar,您必须引用您的应用构建的特定脚手架实例并告诉它显示snackbar。如果上下文方便,你可以说 Scaffold.of(context).showSnackbar(snackbar);由于您无权访问上下文,因此引用 Scaffold 的另一种方法是为脚手架定义一个键,然后确保将该键分配给 webviewer 的脚手架。

你可以说

class MessageHandler extends StatefulWidget 
    // pass a reference to the scaffold key to the message handler when it is created
    final GlobalKey<ScaffoldState> scaffoldKey;
    MessageHandler(this.scaffoldKey);

    @override
    _MessageHandlerState createState() => _MessageHandlerState();
    
class _MessageHandlerState extends State<MessageHandler>
    final FirebaseMessaging _fcm = FirebaseMessaging();
    @override
void initState()
    super.initState();
    _fcm.configure(
  onMessage: (Map<String, dynamic> message) async 
    print("here");
    print("onMessage: $message");
    final snackbar = SnackBar(
      content: Text(message['notification']['title']),
    );

    // reference the scaffold with its key and call showSnackBar
    widget.scaffoldKey.currentState.showSnackbar(snackbar);
  ,
 );

然后在可以传递给消息处理程序和脚手架的地方定义脚手架的键:

final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();

....

Scaffold(
   key: scaffoldKey,
...

更多信息:

Display SnackBar in Flutter

【讨论】:

我已经实现了您的解决方案,但是方法 showSnackbar 没有定义,我不确定该方法的外观。 对不起,我想我遗漏了,您可能需要将全局键的类型定义为脚手架键才能调用 showSnackBar 方法。 对不起,我不明白 如果你说 final GlobalKey scaffoldKey 会起作用吗?在 MessageHandler 中? 谢谢!那条线确实需要改变。

以上是关于接收来自 Firebase 的消息的主要内容,如果未能解决你的问题,请参考以下文章

无法在 React.js 中接收来自 Firebase 的消息

无法在 ios 中接收来自 react-native-firebase 的通知消息

我可以通过 Firebase Admin SDK 接收来自设备的上游消息,而无需在应用程序服务器上实现 XMPP

Win32/64 应用程序是不是可以从 Firebase 接收推送通知消息?

将所有从“Firebase 推送通知”接收的消息存储在移动数据库/本地

Firebase 消息传递方法 swizzling 不起作用