【问题标题】:Flutter chat app: How to find out if notification has to be shown or not?Flutter 聊天应用程序:如何确定是否必须显示通知?
【发布时间】:2019-04-02 06:18:57
【问题描述】:
我在颤振聊天应用程序中使用 fcm。聊天应用程序具有用户可以订阅的不同频道。如果用户订阅了,即使应用程序打开,他也会收到频道中新消息的 fcm 通知。通知是在一个名为频道 ID 的主题上发送的。
现在我当然不想向用户显示通知,如果他打开了新消息出现的频道(因为他无论如何都在看到它)。
我怎样才能知道我是否必须显示通知?
我在 onMessage 回调函数中处理通知。我的想法是找出用户正在查看哪个屏幕或他在哪条路线上,但据我研究,现在有一种方法可以使用导航器来找出用户当前所在的路线。我唯一的另一个想法是以某种方式保存用户在全局状态下看到的当前频道,然后在显示通知之前在 onMessage 回调中检查它,但这看起来很hacky...
【问题讨论】:
标签:
dart
flutter
firebase-cloud-messaging
chat
【解决方案1】:
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 的测试也会有所帮助。