当应用程序处于前台时,firebase 消息不显示通知

时间:2021-07-17 10:06:58

标签: flutter firebase-cloud-messaging

我的 Flutter 应用在​​前台运行时没有显示通知。当它在后台或关闭时工作正常。这是我当前的代码,有人有什么建议吗?我正在使用旧的 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);
  }
}

1 个答案:

答案 0 :(得分:0)

您需要更新您的 <section class="page-rest"> <div class="grid-container"> <div class="feature one"> <img src="https://findicons.com/files/icons/2779/simple_icons/2048/github_2048_black.png" alt=""> <h3>Feature</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, error illum blanditiis esse perspiciatis dolorem!</p> </div> <div class="feature two"> <img src="https://findicons.com/files/icons/2779/simple_icons/2048/github_2048_black.png" alt=""> <h3>Feature</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, error illum blanditiis esse perspiciatis dolorem!</p> </div> <div class="feature three"> <img src="https://findicons.com/files/icons/2779/simple_icons/2048/github_2048_black.png" alt=""> <h3>Feature</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, error illum blanditiis esse perspiciatis dolorem!</p> </div> <div class="feature four"> <img src="https://findicons.com/files/icons/2779/simple_icons/2048/github_2048_black.png" alt=""> <h3>Feature</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, error illum blanditiis esse perspiciatis dolorem!</p> </div> <div class="feature five"> <img src="https://findicons.com/files/icons/2779/simple_icons/2048/github_2048_black.png" alt=""> <h3>Feature</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, error illum blanditiis esse perspiciatis dolorem!</p> </div> <div class="feature six"> <img src="https://findicons.com/files/icons/2779/simple_icons/2048/github_2048_black.png" alt=""> <h3>Feature</h3> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Similique, error illum blanditiis esse perspiciatis dolorem!</p> </div> </div> </section> 以包含您的 onMessage 方法。

showNotification 在应用在前台收到 FCM 通知时调用。

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

flutter_local_notifications

还要确保初始化 onMessage: (Map<String, dynamic> message) async { showNotification(message); _showItemDialog(message); }, 插件。

您的 flutter_local_notifications 方法已包含此内容。

将其添加到 configLocalNotification() 中,如下所示:

initState