如何借助GoRouter在Navigator下方注入Widget处理前台推送通知?
方案1:用全局NavigatorKey搞定(最省心)
直接定义一个全局的Navigator状态key,跳过Widget树的上下文限制,随时随地获取Navigator的上下文。
- 先定义全局key:
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
- 给MaterialApp配置这个key:
MaterialApp( navigatorKey: navigatorKey, builder: (context, child) { return Stack( children: [ child!, // 保留原来的Navigator页面栈 NotificationHandlerWidget(), // 你的全局通知处理Widget ], ); }, // 其他配置(主题、路由等) )
- 在通知处理Widget里用这个key显示Flushbar:
void showNotification(String msg) { final navContext = navigatorKey.currentContext; if (navContext != null) { Flushbar( message: msg, duration: const Duration(seconds: 3), ).show(navContext); } }
方案2:通过Builder获取Navigator上下文(无全局key)
如果不想用全局变量,就利用Builder在Widget树里钻到Navigator的层级,拿到它的上下文。
修改MaterialApp的builder方法:
MaterialApp( builder: (context, child) { return Builder( builder: (navContext) { // 这里的navContext就是带Navigator的上下文 return Stack( children: [ child!, NotificationHandlerWidget(navContext: navContext), ], ); }, ); }, // 其他配置 )
然后在通知处理Widget里存好这个上下文:
class NotificationHandlerWidget extends StatefulWidget { final BuildContext navContext; const NotificationHandlerWidget({super.key, required this.navContext}); @override State<NotificationHandlerWidget> createState() => _NotificationHandlerWidgetState(); } class _NotificationHandlerWidgetState extends State<NotificationHandlerWidget> { @override void initState() { super.initState(); // 在这里初始化推送通知监听,收到通知就调用showFlushbar } void showFlushbar(String msg) { Flushbar( message: msg, duration: const Duration(seconds: 3), ).show(widget.navContext); } @override Widget build(BuildContext context) { return const SizedBox.shrink(); // 这个Widget只做逻辑处理,不用显示UI } }
方案3:嵌套Navigator(不推荐,慎选)
如果前两种都不适用,可以试试嵌套Navigator,但这个会增加路由管理的复杂度,容易搞乱页面栈,非必要别用:
MaterialApp( builder: (context, child) { return Navigator( onGenerateRoute: (settings) { return MaterialPageRoute( builder: (navContext) { return Stack( children: [ child!, NotificationHandlerWidget(navContext: navContext), ], ); }, ); }, ); }, // 其他配置 )
内容的提问来源于stack exchange,提问作者Sebastien
相关产品推荐
相关产品推荐

