Flutter点击通知跳转异常:应用完全关闭时无法导航
问题:应用完全关闭时点击通知无法跳转指定页面
应用后台运行时,点击通知能正常跳转到指定页面;但应用完全关闭后,点击通知启动应用,只会显示启动页、加载初始页面,无法完成跳转,添加延迟也无效。
主函数代码
main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); setupLocator(); await Hive.initFlutter(); Hive.registerAdapter(UserDataAdapter()); await Hive.openBox<UserData>('userData'); await dotenv.load(); await GetStorage.init(); Get.put(MainController()); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); runApp(const MyApp()); }
通知点击触发函数
Future<void> onTapNotification(RemoteMessage message) async { log('Notification tapped', name: 'TAP NOTIFICATION'); inspect(message); Get.toNamed( '/notification-news', parameters: { "news_id": message.data['news_id'], }, ); }
解决方案
核心问题是应用冷启动时,路由框架尚未初始化完成,直接调用Get.toNamed会失效。按以下步骤修改即可解决:
冷启动时保存通知跳转参数
在main函数中,先获取Firebase的初始通知消息(应用完全关闭后点击通知触发的消息),将跳转参数存入全局存储中:main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); // 新增:获取冷启动时的通知消息 RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); if (initialMessage != null) { await GetStorage.init(); // 保存跳转路由和参数 GetStorage().write('target_route', '/notification-news'); GetStorage().write('news_id', initialMessage.data['news_id']); } setupLocator(); await Hive.initFlutter(); Hive.registerAdapter(UserDataAdapter()); await Hive.openBox<UserData>('userData'); await dotenv.load(); await GetStorage.init(); Get.put(MainController()); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); runApp(const MyApp()); }应用初始化完成后执行跳转
在应用的根页面(或初始加载完成后的页面)的initState中,检查是否有保存的跳转参数,有则执行跳转:class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override void initState() { super.initState(); // 等待页面渲染完成后执行 WidgetsBinding.instance.addPostFrameCallback((_) { _handleNotificationJump(); }); } void _handleNotificationJump() async { final storage = GetStorage(); String? targetRoute = storage.read('target_route'); String? newsId = storage.read('news_id'); if (targetRoute != null && newsId != null) { // 执行跳转 Get.toNamed(targetRoute, parameters: {"news_id": newsId}); // 清空参数,避免下次启动重复跳转 storage.remove('target_route'); storage.remove('news_id'); } } @override Widget build(BuildContext context) { return Scaffold( // 页面内容 ); } }保留后台运行时的跳转逻辑
原有的onTapNotification函数无需修改,应用后台运行时路由框架已初始化,直接调用Get.toNamed可正常跳转。
注意事项:
- 确保
GetStorage初始化完成后再读写参数 - 跳转完成后必须清空存储的参数,避免每次冷启动都触发跳转
- 若使用其他状态管理工具,可将参数存入对应状态类,逻辑一致
内容的提问来源于stack exchange,提问作者bomi
相关产品推荐
相关产品推荐

