【问题标题】:Recieving a message from Firebase接收来自 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 通知不适用于模拟器。

标签: android firebase flutter google-cloud-messaging


【解决方案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 中?
  • 谢谢!那条线确实需要改变。
猜你喜欢
  • 2018-05-11
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多