Flutter-Firebase Messaging Snackbar未显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter-Firebase Messaging Snackbar未显示相关的知识,希望对你有一定的参考价值。

[这是问题:应用同时在前台或后台(或已终止)接收到通知,但使用该应用时用于通知的小吃栏不起作用。我是新手,所以也许我犯了一些大错误。

我在下面显示我的代码。如果您想了解更多信息,请询问并感谢您的帮助!

    // Import Package
    import 'dart:io';
    import 'package:app_gap_go/pages/admin/modifySingleMeeting.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:firebase_messaging/firebase_messaging.dart';
    import 'package:flutter/material.dart';
    // import 'package:flutter/rendering.dart';

    // Import Other Package
    import 'package:provider/provider.dart';

    // Import Pagine
    import './pages/wrapper.dart';
    import './pages/setting/settings.dart';
    import './pages/riunioni/riunioni.dart';
    import './pages/auth/register.dart';
    import './pages/admin/pannelloAdmin.dart';
    import './pages/admin/modifyMeetings.dart';

    // Import Utility
    import 'utility/themeData.dart';

    // Import Services
    import './services/authService.dart';

    // Import Models
    import './models/user.dart';

    void main() {
      // debugPaintSizeEnabled = true;   
      // debugPaintBaselinesEnabled = true;
      // debugPaintPointersEnabled = true; 
      runApp(MyApp());
    }

    class MyApp extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _MyAppState();
      }
    }

    class _MyAppState extends State<MyApp> {
      final FirebaseMessaging _fcm = new FirebaseMessaging();
      final Firestore _db = Firestore.instance;
      final FirebaseAuth _auth = FirebaseAuth.instance;
      GlobalKey<ScaffoldState> scaffoldState = new GlobalKey<ScaffoldState>();

      // Request and save token
      Future _saveDeviceToken() async {
        String fcmToken = await _fcm.getToken();
        FirebaseUser user = await _auth.currentUser();
        if (fcmToken != null) {
          var tokenRef = _db
              .collection('utenti')
              .document(user.uid)
              .collection('tokens')
              .document(fcmToken);
          await tokenRef.setData({
            'token': fcmToken,
            'createdAt': FieldValue.serverTimestamp(),
            'platform': Platform.operatingSystem,
          });
        }
      }

      @override
      void initState() {
        _fcm.configure(
          onMessage: (Map<String, dynamic> message) async {
            print("onMessage: $message");

            final snackbar = SnackBar(
              content: Text(message['notification']['title']),
              action: SnackBarAction(
                label: 'Go',
                onPressed: () => null,
              ),
            );
            scaffoldState.currentState.showSnackBar(snackbar);
          },
          onResume: (Map<String, dynamic> message) async {
            print("onResume: $message");
          },
          onLaunch: (Map<String, dynamic> message) async {
            print("onLaunch: $message");
          },
        );
        if(Platform.isios) {
          _fcm.onIosSettingsRegistered.listen((data) {
            _saveDeviceToken();
          });
          _fcm.requestNotificationPermissions(IosNotificationSettings());
        } else {
          _saveDeviceToken();
        }
        _fcm.subscribeToTopic('meetings');
        super.initState();
      }

      @override
      Widget build(BuildContext context) {
        return StreamProvider<User>.value(
          key: scaffoldState,
          value: AuthService().user,
          child: MaterialApp(
            title: "GapGo",
            theme: themeApp,
            routes: {
              '/': (BuildContext context) => Wrapper(),
              '/register': (BuildContext context) => Register(),
              '/settings': (BuildContext context) => Settings(),
              '/riunioni': (BuildContext context) => Riunioni(),
              '/adminPanel': (BuildContext context) => PannelloAdmin(),
              '/modifyMeetings': (BuildContext context) => ModifyMeetings(),
              '/modifySingleMeeting': (BuildContext context) =>
                  ModifySingleMeeting(),
            },
          ),
        );
      }
    // End State
    }
答案

更改此:

SnackBarAction(
                label: 'Go',
                onPressed: () => null,
              ),

进入此:

SnackBarAction(
                label: 'Go',
                onPressed: () => print("pressed"),
              ),

根据文档:

label和onPressed参数必须为非null。

https://api.flutter.dev/flutter/material/SnackBarAction/SnackBarAction.html

另一答案

我确实遇到了同样的问题,我既不能使用对话框也不能使用SnackBar,问题实际上是由于没有导航器路径的当前上下文here is my solution

以上是关于Flutter-Firebase Messaging Snackbar未显示的主要内容,如果未能解决你的问题,请参考以下文章

Flutter-Firebase Messaging Snackbar未显示

Flutter-Firebase phone Auth 总是在 iOS 上返回 Token mismatch

在电子邮件密码身份验证中进行额外的自定义检查 (Flutter - Firebase)

JAVAEE网上商城项目总结

使用JomSocial内置的个人信息系统

实施 Codelab Firebase 聊天示例