接收来自 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以上是关于接收来自 Firebase 的消息的主要内容,如果未能解决你的问题,请参考以下文章
无法在 React.js 中接收来自 Firebase 的消息
无法在 ios 中接收来自 react-native-firebase 的通知消息
我可以通过 Firebase Admin SDK 接收来自设备的上游消息,而无需在应用程序服务器上实现 XMPP
Win32/64 应用程序是不是可以从 Firebase 接收推送通知消息?