进程被杀死时点击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
相关产品推荐
相关产品推荐

