Flutter Flare动画预缓存方法验证及缓存后加载方式咨询
嘿,我来帮你搞定Flare动画预缓存的问题~
Flare动画预缓存的正确姿势
首先回答你的第一个问题:你写的代码思路是对的,但有个关键细节需要调整才能实现有效的预缓存。
一、预缓存Actor的正确写法
cachedActor是一个异步方法(返回Future),直接调用它不会等待缓存完成,这样可能导致动画还没缓存好就被加载,依然会有延迟。所以我们需要处理这个异步操作,确保缓存完成后再去使用动画。
这里给你两种常见的正确写法:
1. 在Widget生命周期中预缓存(页面初始化时)
如果想在某个页面加载前完成缓存,可以在StatefulWidget的initState里处理:
import 'package:flutter/material.dart'; import 'package:flare_flutter/flare_cache.dart'; import 'package:flare_flutter/flare_actor.dart'; import 'package:flutter/services.dart'; class MyFlarePage extends StatefulWidget { @override _MyFlarePageState createState() => _MyFlarePageState(); } class _MyFlarePageState extends State<MyFlarePage> { bool _isAnimationCached = false; @override void initState() { super.initState(); // 启动预缓存 _precacheFlare(); } Future<void> _precacheFlare() async { final AssetProvider assetProvider = AssetFlare( bundle: rootBundle, name: 'assets/animations/loop.flr' ); // 等待缓存完成 await cachedActor(assetProvider); // 标记缓存完成,更新UI setState(() { _isAnimationCached = true; }); } // ... 其他代码 }
2. 在App启动时全局预缓存
如果这个动画是全局常用的,可以在App启动时就完成缓存,后续任何页面使用都能直接读取缓存:
import 'package:flutter/material.dart'; import 'package:flare_flutter/flare_cache.dart'; import 'package:flutter/services.dart'; void main() async { // 必须先初始化Flutter绑定,否则无法调用rootBundle WidgetsFlutterBinding.ensureInitialized(); final AssetProvider assetProvider = AssetFlare( bundle: rootBundle, name: 'assets/animations/loop.flr' ); // 等待缓存完成再启动App await cachedActor(assetProvider); runApp(MyApp()); }
二、缓存完成后加载动画
缓存完成后,加载动画的方式和平时使用FlareActor完全一样——因为cachedActor已经把动画资源提前缓存到内存中了,后续调用FlareActor时会直接读取缓存,不会再从本地文件加载,自然就快了。
比如在上面的页面示例中,我们可以这样渲染:
@override Widget build(BuildContext context) { return Scaffold( body: Center( child: _isAnimationCached ? FlareActor( 'assets/animations/loop.flr', animation: 'loop', // 替换成你动画里的实际动画名称 fit: BoxFit.contain, ) : CircularProgressIndicator(), // 缓存未完成时显示加载占位符 ), ); }
需要注意的是,要确保你已经在pubspec.yaml里正确配置了Flare动画的资源路径,不然缓存和加载都会失败哦~
内容的提问来源于stack exchange,提问作者ilovecse
相关产品推荐
相关产品推荐

