Показывать уведомление FCM в приложении, когда оно открыто (Flutter) - PullRequest
0 голосов
/ 05 августа 2020

Я использую FCM для отправки уведомлений pu sh на свое устройство прямо сейчас, и оно работает отлично. Однако когда приложение открыто, я получаю выполнение onResume только тогда, когда нахожусь на этой конкретной странице. Я хочу отображать уведомление вверху независимо от того, на какой странице (или классе) находится пользователь. В основном я хочу, чтобы уведомления отображались глобально (Показать всплывающее окно). Любая помощь будет оценена. Вот код со страницы, на которой отображаются уведомления.

if (Platform.isIOS) {
     iosSubscription = _fcm.onIosSettingsRegistered.listen((data) {
    _saveDeviceToken();
   });

  _fcm.requestNotificationPermissions(IosNotificationSettings());
} else {
  _saveDeviceToken();
}

_fcm.configure(
  onMessage: (Map<String, dynamic> message) async {
    print("onMessage: $message");
    var temp = message['notification'];
    setState(() {
      title.add(temp['title']);
      body.add(temp['body']);
    });
   
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        content: ListTile(
          title: Text(message['notification']['title']),
          subtitle: Text(message['notification']['body']),
        ),
        actions: <Widget>[
          FlatButton(
            color: const Color(0xFF650572),
            child: Text('Ok'),
            onPressed: () => Navigator.of(context).pop(),
          ),
        ],
      ),
    );
  },
  onLaunch: (Map<String, dynamic> message) async {
    print("onLaunch: $message");
    Navigator.push(
        context, MaterialPageRoute(builder: (context) => MessageHandler()));
    // TODO optional
  },
  onResume: (Map<String, dynamic> message) async {
    print("onResume: $message");
    Navigator.push(context,
        MaterialPageRoute(builder: (context) => MessageHandler()));
    // TODO optional
  },
);

}

1 Ответ

1 голос
/ 05 августа 2020

Оберните ваше MaterialApp в класс-оболочку ... позволяет вызвать этот FCMWrapper.

class FCMWrapper extends StatefulWidget {
  final Widget child;

  const FCMWrapper({Key key, this.child}) : super(key: key);

  @override
  _FCMWrapperState createState() => _FCMWrapperState();
}

class _FCMWrapperState extends State<FCMWrapper> {
  @override
  Widget build(BuildContext context) {
    return Consumer<YourObservable>(
      builder: (context, yourObservable, _) {
        if (yourObservable != null && yourObservable.isNotEmpty) {
          Future(
            () => navigatorKey.currentState.push(
              PushNotificationRoute(
                  child: YourViewOnNotification(),
              )),
            ),
          );
        }
        return widget.child;
      },
    );
  }
}

Я сохранил свои данные в наблюдаемом из отдельного класса. Поэтому, когда я получаю уведомление, я обновляю свой наблюдаемый объект. Поскольку мы используем этот наблюдаемый объект, будет вызван PushNotificationRoute.

PushNotificationRoute - это просто класс, расширяющий ModalRoute.

class PushNotificationRoute extends ModalRoute {
  final Widget child;

  PushNotificationRoute({this.child});

  ... //Override other methods to your requirement

  //This is important
  @override
  Widget buildPage(BuildContext context, Animation<double> animation,
      Animation<double> secondaryAnimation) {
    return SafeArea(
      child: Builder(builder: (BuildContext context) {
        return child;
      }),
    );
  }

  ...
  @override
  Duration get transitionDuration => Duration(milliseconds: 200);
}

Теперь в main.dart объявите глобальный ключ, например

var navigatorKey = GlobalKey<NavigatorState>();

и оберните ваше MaterialApp как

...

FCMWrapper(
          child: MaterialApp(
            navigatorKey: navigatorKey,
            title: 'Your App',

...

Итак, теперь каждый раз, когда приходит уведомление, ваш наблюдаемый объект должен обновляться, а pu sh - модальный маршрут, который будет отображаться в любом месте приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...