Firebase通知异常:App后台关闭时点击跳转空白页求助
问题解决:冷启动点击通知白屏
问题原因
FirebaseMessaging.onMessageOpenedApp仅监听应用处于后台(未被完全清除)时点击通知的场景。当应用被从后台完全清除后,点击通知属于冷启动,此时onMessageOpenedApp不会触发,且导航键navKey可能还未完成初始化,直接调用pushNamed会因currentState为空导致跳转失败,出现白屏。
解决方案
需要同时处理后台唤醒和冷启动两种场景,确保导航键初始化完成后再执行跳转:
- 新增冷启动消息监听:用
FirebaseMessaging.instance.getInitialMessage()获取冷启动时的通知消息 - 统一导航逻辑:将跳转代码抽为独立方法,复用两种场景的处理
- 确保导航键就绪:在应用初始化完成后再执行导航操作
修改后的代码示例
class _MyAppState extends State<MyApp> { static final GlobalKey<NavigatorState> navKey = GlobalKey<NavigatorState>(); @override void initState() { super.initState(); // 处理冷启动时的通知消息 _handleInitialNotification(); // 处理后台唤醒时的通知消息 FirebaseMessaging.onMessageOpenedApp.listen(_navigateToTargetPage); } Future<void> _handleInitialNotification() async { RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { // 等待UI初始化完成,确保navKey.currentState不为空 WidgetsBinding.instance.addPostFrameCallback((_) { _navigateToTargetPage(initialMessage); }); } } void _navigateToTargetPage(RemoteMessage message) { if (navKey.currentState != null) { navKey.currentState!.pushNamed( '/MainPage', arguments: manager.setRetrieveNotification( message.data['km_faktur_id'], ), ); } } @override Widget build(BuildContext context) { return MaterialApp( navigatorKey: navKey, // 务必设置导航键 // ...其他配置 ); } }
关键注意事项
- 必须在
MaterialApp中配置navigatorKey为全局的navKey,否则无法获取导航状态 - 使用
WidgetsBinding.instance.addPostFrameCallback替代固定延迟,能更可靠地确保UI初始化完成,避免currentState为空的问题
内容的提问来源于stack exchange,提问作者Dimas Maulana
相关产品推荐
相关产品推荐

