【问题标题】:firebase messaging not showing notification when the app is in foreground当应用程序处于前台时,firebase 消息不显示通知
【发布时间】:2021-07-17 10:06:58
【问题描述】:

当应用在前台运行时,我的颤振应用没有显示通知。当它在后台或关闭时工作正常。这是我目前的代码,有人有什么建议吗?我正在使用旧的 firebase 消息传递版本,因为我很久以前就开始了这个项目并且没有时间完成它。谢谢

 void main() async {
  runApp(MyApp());
}

Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
  if (message.containsKey('data')) {
    final dynamic data = message['data'];
  }

  if (message.containsKey('notification')) {
    final dynamic notification = message['notification'];
  }
}

final Map<String, Item> _items = <String, Item>{};
Item _itemForMessage(Map<String, dynamic> message) {
  final dynamic data = message['data'] ?? message;
  final String itemId = data['id'];
  final Item item = _items.putIfAbsent(itemId, () => Item(itemId: itemId))
    ..status = data['status'];
  return item;
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _homeScreenText = "Waiting for token...";
  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();

  Widget _buildDialog(BuildContext context, Item item) {
    return AlertDialog(
      content: Text("Item ${item.itemId} has been updated"),
      actions: <Widget>[
        TextButton(
          child: const Text('CLOSE'),
          onPressed: () {
            Navigator.pop(context, false);
          },
        ),
        TextButton(
          child: const Text('SHOW'),
          onPressed: () {
            Navigator.pop(context, true);
          },
        ),
      ],
    );
  }

  void _showItemDialog(Map<String, dynamic> message) {
    showDialog<bool>(
      context: context,
      builder: (_) => _buildDialog(context, _itemForMessage(message)),
    ).then((bool shouldNavigate) {
      if (shouldNavigate == true) {
        _navigateToItemDetail(message);
      }
    });
  }

  void _navigateToItemDetail(Map<String, dynamic> message) {
    final Item item = _itemForMessage(message);
    // Clear away dialogs
    Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
    if (!item.route.isCurrent) {
      Navigator.push(context, item.route);
    }
  }

  initializeFCM() async {
    final _permissionGranted =
        await _firebaseMessaging.requestNotificationPermissions();
    if (_permissionGranted == null || _permissionGranted == true) {
      _firebaseMessaging.configure(
        onBackgroundMessage: myBackgroundMessageHandler,
        onMessage: (Map<String, dynamic> message) async {
          print("onMessage: $message");
          showToastSuccess("You got a new Order!");

          //  HighOrderArea();
          _showItemDialog(message);
        },
        onLaunch: (Map<String, dynamic> message) async {
          print("onLaunch: $message");
          _navigateToItemDetail(message);
        },
        onResume: (Map<String, dynamic> message) async {
          print("onResume: $message");
          _navigateToItemDetail(message);
        },
      );
    }

    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });
    _firebaseMessaging.getToken().then((String token) async {
      assert(token != null);

      var sendToken = await sendNotiTokenApi(token.toString());
      print("tokenadichh");
      print(sendToken);
      setState(() {
        _homeScreenText = "Push Messaging token: $token";
      });
      print(_homeScreenText);
    });
  }

  @override
  void initState() {
    super.initState();
    initializeFCM();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue, fontFamily: 'Poppins'),
      home: SplashScreen(),
    );
  }

  void showNotification(message) async {
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
      Platform.isAndroid
          ? 'com.dfa.flutterchatdemo'
          : 'com.duytq.flutterchatdemo',
      'Flutter chat demo',
      'your channel description',
      playSound: true,
      enableVibration: true,
      importance: Importance.max,
      priority: Priority.high,
    );
    var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
    var platformChannelSpecifics = new NotificationDetails(
        android: androidPlatformChannelSpecifics,
        iOS: iOSPlatformChannelSpecifics);

    print(message);
    await flutterLocalNotificationsPlugin.show(0, message['title'].toString(),
        message['body'].toString(), platformChannelSpecifics,
        payload: json.encode(message));
  }

  void configLocalNotification() {
    var initializationSettingsAndroid =
        new AndroidInitializationSettings('ic_stat_name');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        iOS: initializationSettingsIOS, android: initializationSettingsAndroid);
    flutterLocalNotificationsPlugin.initialize(initializationSettings);
  }
}

【问题讨论】:

    标签: flutter firebase-cloud-messaging


    【解决方案1】:

    您需要更新您的 onMessage 以包含您的 showNotification 方法。

    当应用在前台收到 FCM 通知时调用onMessage

    showNotification 方法包含使用flutter_local_notifications 插件在本地显示通知的代码。

    onMessage: (Map<String, dynamic> message) async {    
      showNotification(message);
      _showItemDialog(message);
    },
    

    还要确保初始化flutter_local_notifications 插件。

    您的 configLocalNotification() 方法已包含此内容。

    像这样在initState 中添加它:

    @override
      void initState() {
        super.initState();
        initializeFCM();
        configLocalNotification();
      }
    

    【讨论】:

    • 我在状态栏上收到通知。但是我在发送通知时没有收到警报对话框。
    • 是的,您需要在onMessage 回调中包含_showItemDialog(message);。我现在已将其包含在答案中。
    • 我已经在 onmessage 中调用了该函数。但它不起作用。警报对话框未出现。
    • 控制台是否出现任何错误?还可以尝试在 onMessage 回调中设置断点,看看会触发什么。
    • 不,控制台中没有错误。我在发送通知时得到了打印和吐司。但没有警报对话框。我做得对吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2018-01-12
    • 1970-01-01
    • 2019-07-02
    • 2016-11-21
    • 1970-01-01
    • 2018-06-13
    • 2018-11-08
    相关资源
    最近更新 更多