You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会失效。按以下步骤修改即可解决:

  1. 冷启动时保存通知跳转参数
    在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());
    }
    
  2. 应用初始化完成后执行跳转
    在应用的根页面(或初始加载完成后的页面)的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(
          // 页面内容
        );
      }
    }
    
  3. 保留后台运行时的跳转逻辑
    原有的onTapNotification函数无需修改,应用后台运行时路由框架已初始化,直接调用Get.toNamed可正常跳转。

注意事项:

  • 确保GetStorage初始化完成后再读写参数
  • 跳转完成后必须清空存储的参数,避免每次冷启动都触发跳转
  • 若使用其他状态管理工具,可将参数存入对应状态类,逻辑一致

内容的提问来源于stack exchange,提问作者bomi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:40:33