首页 > 解决方案 > 在 Flutter 推送通知中转到应用页面

问题描述

我对 Flutter 应用程序的通知有疑问。我想将用户从通知重定向到特定页面。我现在有这样的事情:

  void initState() {
    super.initState();
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
         _goToMessage(message);
      },
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
         _goToMessage(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
         _goToMessage(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) {
      print("Push Messaging token: $token");
    });
  }

  void _goToMessage(message) {
    Navigator.pushNamed(context, DidacticList.routeName);
  }

这段代码给了我一个错误: Navigator operation requested with a context that does not include a Navigator

收到推送通知代码onLaunch()onResume()执行后。

标签: flutterdartnotificationspush

解决方案


您可以在初始化推送通知时从 main.dart 传递上下文,如下所示。

把它放在 MaterialApp Widget 的构建方法中。

  //  init Firebase Push Notification Service...
  PushNotificationsManager(context).init();

BuildContext 初始化后,您可以根据自己的选择使用它。

这是 PushNotificationsManager 类供您参考。

class PushNotificationsManager {
  bool _initialized = false;
  static BuildContext _context;
  Stream<RemoteMessage> _receivedMessages;
  PushNotificationsManager._(_context);

  factory PushNotificationsManager(BuildContext context) {
    _context = context;
    return _instance;
  }

  static final PushNotificationsManager _instance =
      PushNotificationsManager._(_context);

  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;

  Future<void> init() async {
    if (!_initialized) {
      await _firebaseMessaging.requestPermission();
      _receivedMessages = FirebaseMessaging.onMessageOpenedApp;
      //  * Implement on Background Message like follwing...
      // FirebaseMessaging.onBackgroundMessage((message) => );
      //  TODO : Implement on message received...
      _receivedMessages.listen((message) {});
      _initialized = true;
    }
  }
}

您可以使用listen 或onBackgroundMessage 方法在导航点击时导航到任何页面。


推荐阅读