Flutter聊天应用程序:如何确定是否必须显示通知?

时间:2018-10-29 10:25:40

标签: dart flutter firebase-cloud-messaging chat

我在动态聊天应用程序中使用了fcm。聊天应用程序具有用户可以订阅的不同渠道。如果用户已订阅,即使该应用程序已打开,他也将在频道中收到有关新消息的fcm通知。通知以与通道ID相似的名称发送。 现在,我当然不希望向用户显示通知,如果他在新消息出现的地方打开了频道(因为无论如何他都会看到它)。 如何找出是否必须显示通知?

我在onMessage回调函数中处理通知。我的想法是找出用户正在查看哪个屏幕或他所走的路线,但是据我所研究,现在有一种方法可以使用导航器来找出用户所处的当前路线。我唯一的其他想法是以某种方式将用户正在查看的当前频道保存为全局状态,然后在显示通知之前在onMessage回调中对其进行检查,但这似乎很hacky ...

1 个答案:

答案 0 :(得分:0)

Flutter的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

查看RouteNavigator的测试也会有所帮助。