跳到主要内容

缓存 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');

再将缓存对象分发给多个渲染节点使用。