我在一个flutter聊天应用程序中使用fcm。聊天应用程序有不同的频道,用户可以订阅。如果用户订阅了,即使应用程序打开,他也会收到频道中新消息的fcm通知。通知是在一个与频道id类似的主题上发送的。现在,如果用户打开了出现新消息的频道,我当然不想向他显示通知(因为他无论如何都会看到(。我该如何确定是否必须出示通知?
我在onMessage回调函数中处理通知。我的想法是找出用户看到的屏幕或他在哪条路线上,但据我所研究,现在有办法使用导航器来找出用户当前所在的路线。我唯一的另一个想法是以某种方式将用户看到的当前频道保存为全局状态,然后在显示通知之前在onMessage回调中检查它,但这似乎非常棘手。。。
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
查看Route和Navigator的测试也会有所帮助。