Untitled
import 'package:flutter/material.dart'; import 'package:lottie/lottie.dart'; class LottieSliderController extends StatefulWidget { final String assetPath; final double startFrame; final double endFrame; const LottieSliderController({ Key? key, required this.assetPath, required this.startFrame, required this.endFrame, }) : super(key: key); @override _LottieSliderControllerState createState() => _LottieSliderControllerState(); } class _LottieSliderControllerState extends State<LottieSliderController> with TickerProviderStateMixin { late AnimationController _controller; LottieComposition? _composition; double _sliderValue = 0.0; @override void initState() { super.initState(); _loadAnimation(); } Future<void> _loadAnimation() async { _composition = await LottieComposition.fromAsset( context, widget.assetPath, ); if (_composition != null) { _controller = AnimationController( vsync: this, duration: _composition!.duration, ); setState(() {}); } } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (_composition == null || _controller == null) { return const Center(child: CircularProgressIndicator()); } final totalFrames = _composition!.durationFrames.toDouble(); final startFrame = widget.startFrame.clamp(0, totalFrames); final endFrame = widget.endFrame.clamp(0, totalFrames); return Column( children: [ Slider( value: _sliderValue, onChanged: (value) { setState(() { _sliderValue = value; // Calculate current frame between start and end final frame = startFrame + (endFrame - startFrame) * value; _controller.value = frame / totalFrames; }); }, ), Lottie( composition: _composition, controller: _controller, frameRate: FrameRate.max, ), ], ); } }
Leave a Comment