Приложение для чата Flutter: Как узнать, должно ли отображаться уведомление или нет? - PullRequest
0 голосов
/ 29 октября 2018

Я использую fcm в приложении чата. В приложении чата есть разные каналы, на которые пользователь может подписаться. Если пользователь подписан, он будет получать уведомления fcm о новых сообщениях в канале, даже если приложение открыто. Уведомления рассылаются по теме, которая называется как идентификатор канала. Теперь, конечно, я не хочу показывать пользователю уведомление, если у него есть открытый канал, где появляется новое сообщение (потому что он все равно его видит). Как я могу узнать, должен ли я показать уведомление или нет?

Я обрабатываю уведомление в функции обратного вызова onMessage. Моя идея состояла в том, чтобы выяснить, какой экран видит пользователь или какой маршрут он использует, но, насколько я исследовал, теперь есть способ использовать навигатор для определения текущего маршрута, на котором находится пользователь. Моя единственная другая идея состояла бы в том, чтобы каким-то образом сохранить текущий канал, который пользователь видит в глобальном состоянии, и затем проверить его в обратном вызове onMessage, прежде чем показывать уведомление, но это кажется очень хакерским ...

1 Ответ

0 голосов
/ 30 октября 2018

У Flutter's MaterialApp есть наблюдатель маршрута, который можно использовать для информирования о маршруте виджета. Виджет может подписываться на изменения маршрута и при отображении реагировать на текущий маршрут. Используя это, вы можете настроить маршрутизацию некоторых виджетов и иметь возможность подписываться / отписываться от тем FCM в зависимости от того, по какому маршруту в данный момент находится пользователь. По крайней мере, на это стоит взглянуть.

 // Register the RouteObserver as a navigation observer.
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
void main() {
  runApp(MaterialApp(
    home: Container(),
    navigatorObservers: [routeObserver],
  ));
}

class RouteAwareWidget extends StatefulWidget {
  State<RouteAwareWidget> createState() => RouteAwareWidgetState();
}

// Implement RouteAware in a widget's state and subscribe it to the RouteObserver.
class RouteAwareWidgetState extends State<RouteAwareWidget> with RouteAware {

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    routeObserver.subscribe(this, ModalRoute.of(context));
  }

  @override
  void dispose() {
    routeObserver.unsubscribe(this);
    super.dispose();
  }

  @override
  void didPush() {
    // Route was pushed onto navigator and is now topmost route.
  }

  @override
  void didPopNext() {
    // Covering route was popped off the navigator.
  }

  @override
  Widget build(BuildContext context) => Container();

}  

Для получения дополнительной информации см. RouteObserver

Можно также посмотреть тесты для Маршрут и Навигатор .

...