缓存 Rive 文件(Caching a Rive File)
多数场景下 .riv 加载很快,不必手动管理文件对象。
但当你在多个页面或同屏多处复用同一文件时,建议预加载并缓存,可减少重复解析成本。
基本示例(旧 API)
class PreloadRive extends StatefulWidget {
const PreloadRive({super.key});
@override
State<PreloadRive> createState() => _PreloadRiveState();
}
class _PreloadRiveState extends State<PreloadRive> {
RiveFile? _file;
@override
void initState() {
super.initState();
preload();
}
Future<void> preload() async {
rootBundle.load('assets/little_machine.riv').then((data) async {
setState(() {
_file = RiveFile.import(data);
});
});
}
@override
Widget build(BuildContext context) {
return (_file == null) ? const SizedBox.shrink() : RiveAnimation.direct(_file!);
}
}
实践建议
状态管理
缓存文件如何共享,取决于你的状态管理方案(Provider / Riverpod / Bloc 等)。
可选策略:
- 应用启动阶段预加载
- 按业务分区延迟加载
内存
手动管理缓存可更细粒度控制内存,特别是多实例复用同一文件时。
可配合 Flutter DevTools 的内存分析进一步评估。
网络资源
网络加载同样建议考虑复用:
final riveFile = await RiveFile.network('YOUR:URL');
再将缓存对象分发给多个渲染节点使用。