Flutter动画展示插件overlay_lottie的使用
Flutter动画展示插件overlay_lottie的使用
展示互动性在应用程序中非常重要,即使在执行阻塞任务(如登录)时也是如此。在这些期间,可以使用神奇的 Lottie Files 展示一个精美的动画。
虽然构建和展示动画很容易,但根据 StatefulWidget 的状态来构建它会更简单。而且如果不需要控制何时停止展示动画(例如,当动画结束、重复特定次数或任务完成时),那就更好了。
这个包提供了一个混入类,简化了在任意小部件上叠加 Lottie 动画的过程,以便在执行长时间任务时显示活动。
特性
这个混入类的基本特性包括:
-
从动画开始到结束展示一次(即 1 次循环)

-
从动画开始到结束展示多次(即多次循环)

-
在限定时间内展示动画(例如 2 秒)

-
在执行函数期间展示动画

开始使用
要开始使用此包,请将其添加到您的 pubspec.yaml 文件中:
dependencies:
overlay_lottie:
然后获取依赖项(例如 flutter pub get),并在应用中导入它们:
import 'package:overlay_lottie/overlay_lottie.dart';
使用方法
您需要将混入类添加到您的 StatefulWidget 中,并且与 TickerProviderStateMixin 混入一起使用。然后在 build 方法中使用 buildWithLottieOverlay 函数:
class _LottieOverlayHomeState extends State<LottieOverlayHome> with TickerProviderStateMixin, OverlayLottie {
Widget build(BuildContext context) {
return Scaffold(
appBar: null,
body: buildWithLottieOverlay(
animationUrl: "https://assets6.lottiefiles.com/packages/lf20_fj8rlma5.json",
),
child: Center(
child: ElevatedButton(
onPressed: () => showLottieOverlay(repetitions: 1),
child: const Text("show Lottie")
)
)
);
}
}
这将产生以下应用:

额外信息
有多种机制和选项可以控制如何以及何时显示覆盖层:通过编程隐藏动画(即 showLottieOverlay … hideLottieOverlay)、在函数执行期间显示动画,或者在一段时间内显示动画。
构建覆盖层的函数接口如下:
Widget buildWithLottieOverlay({
required Widget child,
String? animationUrl,
Duration? durationPerRepetition,
int defaultNumberOfRepetitions = 1,
bool blurContent = false,
double opacity = 0.8,
VoidCallback? onHide,
fadeIn = true
})
该函数定义了过程的默认值,但其中一些值可以在展示动画时被覆盖。
child:显示在覆盖层下的内容。animationUrl:指向 Lottie 文件的字符串。如果以https://或http://开头,将使用Lottie.network创建。否则,将被视为资源文件并使用Lottie.asset创建。durationPerRepetition:每次循环的持续时间。如果您有一个(例如 4 秒)的动画,但想让它在 2 秒内运行。defaultNumberOfRepetitions(默认为 1):使用showLottieOverlay展示动画时,动画需要循环的次数才能自动关闭。如果希望动画不自动关闭并继续重复直到调用hideLottieOverlay,请设置此值为double.maxFinite.toInt()。blurContent(默认为 false):如果设置为true,子部件将被模糊(以产生非交互的感觉)。opacity(默认为 0.8):如果设置为 1 以外的值,子部件将通过此因子设置为半透明。onHide:动画隐藏时调用的回调(无论是自动关闭还是使用hideLottieOverlay函数关闭)。fadeIn:是否在显示动画时添加淡入效果(true 淡入;false 跳过淡入)。
显示覆盖层
有多重函数用于显示覆盖层:
Future<bool> showLottieOverlay({
bool? force,
int? repetitions,
String? animationUrl,
VoidCallback? onHide
})
这是基本函数,用于展示动画 animationUrl,循环 repetitions 次,并在动画隐藏时调用函数 onHide。如果没有提供 repetitions、animationUrl 或 onHide,则它们将默认为 buildWithLottieOverlay 调用中的值。
如果动画已经正在显示,则小部件的状态不会改变,并且不会调用 onHide。除非参数 force 设置为 true。
该函数返回 Future<bool> 以启用函数链式执行(例如使用 then)。未来的结果指的是动画是否已显示(即 true)或已经显示(即 false)。
void hideLottieOverlay([bool force = false])
此函数隐藏覆盖层并重新启用子部件。该函数旨在在调用 showLottieOverlay 后使用,但建议使用自动关闭功能(例如运行动画几次循环,或在执行函数期间)。
如果动画已经隐藏,则小部件的状态不会改变,除非参数 force 设置为 true。
Future<bool> showLottieOverlayWhile(
Function callback,
{String? animationUrl, Duration? timeout, Function? onTimeout, VoidCallback? onHide}
)
此函数在执行 callback 期间显示 Lottie 动画 animationUrl。可以设置 timeout 用于执行。如果执行时间超过该时间,callback 的执行将被中止,并调用 onTimeout 函数。
如果没有提供 animationUrl 或 onHide,则它们将默认为 buildWithLottieOverlay 调用中的值。
该函数返回 Future<bool>,在 callback 执行完毕(或中止)后解析。因此,可以使用 await 或 then 过程链式执行其他函数。此过程独立于 onHide 回调,因此两者都可能被调用并且 then 可能被执行。
结果为 true 表示动画已显示并隐藏。如果调用 showLottieOverlayWhile 时动画已经显示,则 future 的结果将被设置为 false。
Future<bool> showLottieOverlayDuring(Duration period, {String? animationUrl, VoidCallback? onHide});
此函数在 period 时间内显示 Lottie 动画 animationUrl。如果没有提供 animationUrl 或 onHide,则它们将默认为 buildWithLottieOverlay 调用中的值。
实际上,这是 return showLottieOverlayWhile(() async => await Future.delayed(period), onHide: onHide, animationUrl: animationUrl) 的快捷方式。
示例代码
import 'package:flutter/material.dart';
import 'package:overlay_lottie/overlay_lottie.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Overlay Lottie Demo',
home: LottieOverlayHome(),
);
}
}
class LottieOverlayHome extends StatefulWidget {
const LottieOverlayHome({super.key});
[@override](/user/override)
State<LottieOverlayHome> createState() => _LottieOverlayHomeState();
}
class _LottieOverlayHomeState extends State<LottieOverlayHome>
with TickerProviderStateMixin, OverlayLottie {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: null,
body: buildWithLottieOverlay(
animationUrl:
"https://assets6.lottiefiles.com/packages/lf20_fj8rlma5.json",
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => showLottieOverlay(repetitions: 3),
child: const Text("show Lottie")),
ElevatedButton(
onPressed: () {
showLottieOverlayWhile(
() async {
await Future.delayed(const Duration(seconds: 3));
},
animationUrl:
"https://assets6.lottiefiles.com/packages/lf20_z3pnisgt.json",
).then((value) {
showLottieOverlay(
animationUrl:
"https://assets8.lottiefiles.com/packages/lf20_slGFhN.json");
});
},
child: const Text("simulate login")),
],
),
)),
);
}
}
更多关于Flutter动画展示插件overlay_lottie的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动画展示插件overlay_lottie的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用overlay_lottie插件来展示动画的示例代码。overlay_lottie插件允许你在Flutter应用中轻松集成Lottie动画,并且可以通过Overlay机制在屏幕上覆盖显示这些动画。
首先,确保你已经在pubspec.yaml文件中添加了overlay_lottie和lottie依赖项:
dependencies:
flutter:
sdk: flutter
overlay_lottie: ^0.4.0 # 请检查最新版本号
lottie: ^1.2.1 # 请检查最新版本号
然后,运行flutter pub get来安装这些依赖项。
接下来,创建一个Flutter应用并展示Lottie动画。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:overlay_lottie/overlay_lottie.dart';
import 'package:lottie/lottie.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Overlay Lottie Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
OverlayEntry? _overlayEntry;
final LottieComposition? _composition;
_MyHomePageState()
: _composition = LottieComposition.asset('assets/animation.json'); // 确保你有一个Lottie动画文件在assets目录下
@override
void initState() {
super.initState();
_composition?.load().then((_) {
// 预加载动画,可以在需要时立即显示
});
}
void _showLottieOverlay() {
if (_overlayEntry != null) return;
_composition?.createAnimationController(vsync: this)!
..addStatusListener((status) {
if (status == AnimationStatus.completed) {
_overlayEntry?.remove();
_overlayEntry = null;
}
});
final renderBox = context.findRenderObject() as RenderBox;
final overlayState = Overlay.of(context)!;
_overlayEntry = OverlayEntry(
builder: (context) => Positioned(
width: renderBox.size.width * 0.8, // 自定义宽度
height: renderBox.size.height * 0.8, // 自定义高度
left: (renderBox.size.width - (renderBox.size.width * 0.8)) / 2, // 居中
top: (renderBox.size.height - (renderBox.size.height * 0.8)) / 2, // 居中
child: LottieBuilder.asset(
'assets/animation.json',
controller: _composition?.createAnimationController(vsync: this),
onLoaded: (composition) {
composition.play();
},
),
),
);
overlayState.insert(_overlayEntry!);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Overlay Lottie Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: _showLottieOverlay,
child: Text('Show Lottie Animation'),
),
),
);
}
@override
void dispose() {
_composition?.dispose();
_overlayEntry?.remove();
super.dispose();
}
}
在这个示例中:
- 我们首先在
pubspec.yaml中添加了overlay_lottie和lottie依赖项。 - 在
MyApp中设置了基本的Material应用。 - 在
MyHomePage中,我们创建了一个按钮,当点击按钮时,会通过Overlay显示Lottie动画。 - 使用
LottieComposition.asset加载Lottie动画文件,并创建一个AnimationController来控制动画。 - 使用
OverlayEntry将动画覆盖在当前页面上,并在动画播放完成后移除OverlayEntry。
请确保将你的Lottie动画文件(例如animation.json)放在assets目录下,并在pubspec.yaml中正确声明资源:
flutter:
assets:
- assets/animation.json
这个示例展示了如何使用overlay_lottie插件在Flutter应用中覆盖显示Lottie动画。你可以根据需要调整动画的大小、位置和触发条件。

