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

进程被杀死时点击FCM通知启动Flutter应用,flutter_native_splash不显示

问题原因

应用从进程被杀状态通过FCM通知启动时,getInitialMessage的异步逻辑会在启动页完成展示前触发页面导航,直接跳过了启动页。另外你之前调用FlutterNativeSplash.preserve()的时机不对,没覆盖到FCM启动的完整初始化流程。

解决方案

1. 调整main函数初始化顺序

在main函数里先保留启动页,再执行Firebase等初始化操作,确保启动页在所有异步初始化过程中保持显示:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 优先保留启动页,再执行后续初始化
  FlutterNativeSplash.preserve();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  
  // 其他初始化代码...
  
  runApp(const MyApp());
}

2. 延迟处理FCM导航逻辑

不要在initState中直接触发导航,等待Flutter第一帧渲染完成后再处理,同时手动控制启动页的释放时机:

@override
void initState() {
  super.initState();
  // 等待第一帧渲染完成后再处理FCM消息
  WidgetsBinding.instance.addPostFrameCallback((_) => _processInitialFCMMessage());
}

void _processInitialFCMMessage() async {
  final initialMessage = await FirebaseMessaging.instance.getInitialMessage();
  if (initialMessage != null) {
    // 先完成FCM数据处理
    await setFCM(initialMessage);
    await getFCMList("all");
    
    // 手动释放启动页,确保它已展示过
    FlutterNativeSplash.remove();
    
    if (mounted) {
      Navigator.pushNamed(context, '/fcmmessage',
        arguments: FcmMessageArguments(_fcmList[0], true),
      );
    }
  } else {
    // 正常启动流程,释放启动页
    FlutterNativeSplash.remove();
  }
}

3. 检查flutter_native_splash配置

确认pubspec.yaml中的启动页配置无冲突,比如是否开启了fullscreen、图片路径是否正确,确保Android和iOS端的启动页资源配置一致。

核心要点
  • FlutterNativeSplash.preserve()必须在runApp()之前调用,才能在初始化阶段锁定启动页。
  • 处理FCM导航前手动调用FlutterNativeSplash.remove(),避免启动页被导航逻辑直接跳过。
  • 使用addPostFrameCallback确保在UI渲染完成后再处理导航,保证启动页有足够的展示时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:11:26