Получение сообщения от Firebase - PullRequest
0 голосов
/ 16 января 2020

Я делаю простое приложение, которое использует виджет 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']),
    );
  },
 );

Main

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 сообщение, кажется, было отправлено

amazon console

, но предупреждение не появляется в эмуляторе 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);
      },
    )
);

1 Ответ

1 голос
/ 16 января 2020

Чтобы отобразить снэк-бар, вы должны сослаться на конкретный экземпляр c скаффолда, который было создано вашим приложением, и сказать ему, чтобы он отображал снэк-бар. Если контекст удобен, вы можете сказать 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,
...

Дополнительная информация:

Отображение SnackBar в флаттере

...