You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:22:43