Flutter默认启动页加载过慢问题求助(已配置Flavor)
Flutter启动页加载缓慢问题排查与优化方案
核心问题分析
从你提供的main_dev.dart代码来看,启动阶段的串行异步初始化操作是导致启动页耗时过长的主要原因:
Firebase.initializeApp()、MobileAds.instance.initialize()、FirebaseMessaging.instance.getToken()等操作均为串行await执行,总耗时等于各操作耗时之和_initConfig()中的RemoteConfig同步拉取逻辑也会阻塞启动流程
具体优化方案
1. 并行执行异步初始化任务
将多个独立的异步初始化操作合并为并行执行,大幅减少总耗时:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 并行执行多个异步任务,总耗时取最长任务的耗时 await Future.wait([ Firebase.initializeApp(), // 若广告非启动必需,可移至后续环节 MobileAds.instance.initialize(), _initConfig(), ]); FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); // FCM Token改为异步非阻塞获取,不卡启动 FirebaseMessaging.instance.getToken().then((fcmToken) { if (fcmToken != null) { // 通过状态管理工具(如Provider)或StatefulWidget更新全局配置 } }); FirebaseMessaging.onMessageOpenedApp.listen( (RemoteMessage message) => {print('onMessageOpenedApp $message')}); // 无需等待FCM Token,直接启动App var configuredApp = AppConfig( appDisplayName: "dev Config", fcmToken: "", // 初始占位,后续更新 baseUrl: 'https://dev-services.ducoinsure.com/', appInternalId: 1, child: const MyHomepage(), ); mainCommon(); runApp(configuredApp); } Future<void> _initConfig() async { await _remoteConfig.setConfigSettings(RemoteConfigSettings( fetchTimeout: const Duration(seconds: 1), // 延长缓存间隔,减少启动时的网络请求 minimumFetchInterval: const Duration(hours: 1), )); // 后台异步拉取配置,不阻塞启动流程 _remoteConfig.fetchAndActivate().catchError((e) { // 拉取失败时直接使用本地缓存配置 }); }
2. 延迟非核心初始化操作
将非启动必需的操作延迟到App启动后执行:
- 广告初始化可迁移至
MyHomepage的initState方法中 - RemoteConfig的拉取逻辑改为后台异步执行,启动时优先使用本地缓存
3. 优化FCM Token获取流程
FCM Token无需在启动阶段同步获取:
- 先用空值或占位符启动App
- 获取到Token后通过状态管理工具更新全局配置,或直接触发相关业务逻辑
4. 检查Flavor资源加载
确保不同Flavor的资源无冗余加载:
- 检查
android/app/src和ios/Runner下各Flavor目录的启动图、配置文件是否精简 - 避免不同Flavor之间重复引入不必要的依赖库
额外建议
- 使用Flutter DevTools的Performance面板分析启动阶段的耗时任务,精准定位阻塞点
- 切换至release模式测试启动速度(debug模式会额外加载调试资源,影响启动效率)
内容的提问来源于stack exchange,提问作者Mari Selvan
相关产品推荐
相关产品推荐

