Flutter中是否存在可对Lottie动画进行预缓存的实现方法?
可以采用和SVG预缓存类似的逻辑实现Lottie动画资源的预加载,从根本上解决首次渲染延迟的问题。
实现步骤
- 提前预加载Lottie资源
在main方法中完成Flutter初始化后,将Lottie资源的加载逻辑加入到原有Future.wait队列中,和SVG资源同步预缓存。你可以选择将预加载完成的LottieComposition对象存入全局变量,方便后续直接调用:
// 全局存储预加载的Lottie实例 LottieComposition? heartbeatLoadingComposition; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 统一预缓存所有静态资源 await Future.wait([ // 原有SVG预缓存逻辑保留 precachePicture( ExactAssetPicture(SvgPicture.svgStringDecoder, 'assets/svg/login.svg'), null, ), precachePicture( ExactAssetPicture(SvgPicture.svgStringDecoder, 'assets/svg/logo.svg'), null, ), precachePicture( ExactAssetPicture(SvgPicture.svgStringDecoder, 'assets/svg/signup_panel_1.svg'), null, ), // 新增Lottie动画预缓存 LottieComposition.fromAsset('assets/lottie/heartbeat_loading.json') .then((value) => heartbeatLoadingComposition = value), ]); runApp(const MyApp()); }
- 修改Loading组件调用逻辑
将原有Lottie.asset的异步加载方式,改为直接传入预加载完成的LottieComposition对象,做到渲染无延迟:
Widget _buildAnimation() { return Lottie( composition: heartbeatLoadingComposition, width: 300, repeat: true, animate: true, ); }
补充说明
Lottie内部自带资源缓存机制,如果你不想定义全局变量,只要提前调用过一次LottieComposition.fromAsset加载对应资源,后续再使用Lottie.asset加载同路径资源时也会自动命中缓存,无需额外修改组件代码。如果你的应用有单独的闪屏页,也可以将预缓存逻辑放在闪屏页的初始化阶段执行,效果一致。
内容的提问来源于stack exchange,提问作者nyphur
相关产品推荐
相关产品推荐

