欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > flutter 的lottie执行一次动画后关闭

flutter 的lottie执行一次动画后关闭

2025/6/14 20:45:32 来源:https://blog.csdn.net/weixin_43575775/article/details/148604356  浏览:    关键词:flutter 的lottie执行一次动画后关闭
flutter_gen  管理静态资源,包含lottile的管理

CBAnimationBuilder 自动管理controller

import 'package:flutter/material.dart';typedef CBAnimationWidgetBuilder = Widget Function(BuildContext context,Widget? child,Animation animation,AnimationController controller,
);typedef CBAnimationEndCallback = void Function(Animation animation, AnimationController controller);class CBAnimationBuilder extends StatefulWidget {final Duration duration;final bool repeat;final Widget? child;final CBAnimationWidgetBuilder builder;final CBAnimationEndCallback? onEnd;const CBAnimationBuilder({super.key,this.duration = const Duration(milliseconds: 300),this.repeat = false,this.child,required this.builder,this.onEnd,});@overrideState<StatefulWidget> createState() => _CBAnimationBuilderState();
}class _CBAnimationBuilderState extends State<CBAnimationBuilder>with TickerProviderStateMixin {late final AnimationController controller;late final Animation<double> animation;@overridevoid initState() {super.initState();controller = AnimationController(vsync: this,duration: widget.duration,);animation = Tween<double>(begin: 0, end: 1).animate(controller);controller.forward();if (widget.repeat) {controller.repeat();}}@overridevoid dispose() {controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return AnimatedBuilder(animation: animation,child: widget.child,builder: (context, child) {if (animation.isCompleted || animation.isDismissed) {widget.onEnd?.call(animation, controller);}return widget.builder(context, child, animation, controller);},);}
}

使用

import 'package:bcf/app/bc_widget/animation_builder.dart';
import 'package:bcf/app/bc_widget/bc_widgets.dart';
import 'package:bcf/gen/assets.gen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';enum LottieType {peach,eggplant,fire,rainbow,chili;Widget get lottie {return switch (this) {LottieType.peach => CBAnimationBuilder(repeat: false,duration: const Duration(seconds: 1),builder: (ctx, Widget? w, a, c) {return Assets.lottie.commentAnimatPeach.lottie(controller: c);},onEnd: (a, c) => Get.back(),),LottieType.eggplant => CBAnimationBuilder(repeat: false,duration: const Duration(seconds: 1),builder: (ctx, Widget? w, a, c) {return Assets.lottie.commentAnimatEggplant.lottie(controller: c);},onEnd: (a, c) => Get.back(),),LottieType.fire => CBAnimationBuilder(repeat: false,duration: const Duration(seconds: 1),builder: (ctx, Widget? w, a, c) {return Assets.lottie.commentAnimatFire.lottie(controller: c);},onEnd: (a, c) => Get.back(),),LottieType.rainbow => CBAnimationBuilder(repeat: false,duration: const Duration(seconds: 1),builder: (ctx, Widget? w, a, c) {return Assets.lottie.commentAnimatRainbow.lottie(controller: c);},onEnd: (a, c) => Get.back(),),LottieType.chili => CBAnimationBuilder(repeat: false,duration: const Duration(seconds: 1),builder: (ctx, Widget? w, a, c) {return Assets.lottie.commentAnimatChili.lottie(controller: c);},onEnd: (a, c) => Get.back(),),};}
}class CommentLottiePanel extends StatelessWidget {const CommentLottiePanel({super.key, this.onComplete});final Function(LottieType)? onComplete;@overrideWidget build(BuildContext context) {return Container(color: Colors.white,padding: EdgeInsets.symmetric(horizontal: 22.w, vertical: 10.h),child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [DefaultInWell(onTap: () => openShowLottie(LottieType.peach), child: Assets.images.icPeach.image(height: 49.h)),DefaultInWell(onTap: () => openShowLottie(LottieType.eggplant), child: Assets.images.icEggplant.image(height: 49.h)),DefaultInWell(onTap: () => openShowLottie(LottieType.fire), child: Assets.images.icFire.image(height: 49.h)),DefaultInWell(onTap: () => openShowLottie(LottieType.rainbow), child: Assets.images.icRainbow.image(height: 49.h)),DefaultInWell(onTap: () => openShowLottie(LottieType.chili), child: Assets.images.icChili.image(height: 49.h)),],),);}openShowLottie(LottieType type) async {await Get.dialog(barrierDismissible: false,SizedBox(height: 1.sh, width: 2.sw, child: type.lottie));onComplete?.call(type);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词