在flutter上使用Firebase云消息传递在推送通知上打开某些页面

时间:2018-11-21 09:32:36

标签: dart flutter

我已经设法使用Firebase云消息传递将通知推送到我的flutter应用程序。我现在想做的是,一旦我单击通知,它将直接转到应用程序具有的特定页面。如何将通知重定向到特定页面?谢谢

2 个答案:

答案 0 :(得分:2)

在我的FCM课堂上,我有这样的事情:

static StreamController<Map<String, dynamic>> _onMessageStreamController =
      StreamController.broadcast();
static StreamController<Map<String, dynamic>> _streamController =
      StreamController.broadcast();
static final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
static final Stream<Map<String, dynamic>> onFcmMessage =
      _streamController.stream;

static setupFCMListeners() {
    print("Registered FCM Listeners");
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        _onMessageStreamController.add(message);
      },
      onLaunch: (Map<String, dynamic> message) async {
        _streamController.add(message);
      },
      onResume: (Map<String, dynamic> message) async {
        _streamController.add(message);
      },
    );
  }

  static Widget handlePath(Map<String, dynamic> dataMap) {
    var path = dataMap["route"];
    var id = dataMap["id"];
    return handlePathByRoute(path, id);
  }

  static Widget handlePathByRoute(String route, String routeId) {
    switch (route) {
      case "user":
        return Profile(guid: routeId);
      case "event":
        return EventInfo(eventId: routeId);
      case "messaging":
        return MessagingView(guid: routeId);
      default:
        return null;
    }
  }

我的main.dart订阅了onFcmMessage流,但是您不需要流来完成所有这一切。另外,您需要一些代码来处理流失败和关闭。

但是,当应用程序出现在前台时,它将通过onMessage回调或onLaunchonResume回调获取消息。在FCM flutter pub文档上检查它们之间的差异。

方法handlePathhandlePathByRoute是通常我的main.dart或其他侦听通知的类调用的方法,以获取要路由到的路径,但是您只需替换流就可以直接调用它们代码如下:

static setupFCMListeners() {
    print("Registered FCM Listeners");
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("Message: $message"); // Not handling path since on notification in app it can be weird to open a new page randomly.
      },
      onLaunch: (Map<String, dynamic> message) async {
        handlePath(message);
      },
      onResume: (Map<String, dynamic> message) async {
        handlePath(message);
      },
    );
  }

说实话,这甚至可能不是最佳方法,甚至不是一个好的方法,但是由于缺乏文档,这就是我目前正在使用的方法。我很想尝试GünterZöchbauer的方法,并尽可能保存一些对象创建!

希望这会有所帮助! :)

编辑:ProfileEventInfoMessagingView是扩展StatefulWidget的三个类,如果不清楚,抱歉。

您还可以尝试使用命名路由,它们使它们像api路由一样容易,并且避免了很多导入操作,并且具有中央路由器,但是AFAIK他们缺少过渡配置。

答案 1 :(得分:0)

不要忘记在通知数据中添加 click_action。

'click_action': 'FLUTTER_NOTIFICATION_CLICK'

看到这个

https://stackoverflow.com/a/65597471/11230524