Untitled

 avatar
unknown
plain_text
3 days ago
2.1 kB
6
Indexable
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