接收来自 Firebase 的消息

Recieving a message from Firebase

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

我的 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 Widget 有效,所以我没有将它添加到问题中。 在 Firebase 控制台上,消息似乎已发送

但是 Android 模拟器上没有出现警报,snackbar.

上也没有

WebView

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);
      },
    )
);

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

你可以说

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,
...

更多信息: