fading_index_stack.dart 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import 'package:flutter/material.dart';
  2. import 'package:time/time.dart';
  3. class FadingIndexedStack extends StatefulWidget {
  4. final int index;
  5. final List<Widget> children;
  6. final Duration duration;
  7. const FadingIndexedStack({
  8. Key? key,
  9. required this.index,
  10. required this.children,
  11. this.duration = const Duration(
  12. milliseconds: 250,
  13. ),
  14. }) : super(key: key);
  15. @override
  16. _FadingIndexedStackState createState() => _FadingIndexedStackState();
  17. }
  18. class _FadingIndexedStackState extends State<FadingIndexedStack> {
  19. double _targetOpacity = 1;
  20. @override
  21. void didUpdateWidget(FadingIndexedStack oldWidget) {
  22. if (oldWidget.index == widget.index) return;
  23. setState(() => _targetOpacity = 0);
  24. Future.delayed(1.milliseconds, () => setState(() => _targetOpacity = 1));
  25. super.didUpdateWidget(oldWidget);
  26. }
  27. @override
  28. Widget build(BuildContext context) {
  29. return TweenAnimationBuilder<double>(
  30. duration: _targetOpacity > 0 ? widget.duration : 0.milliseconds,
  31. tween: Tween(begin: 0, end: _targetOpacity),
  32. builder: (_, value, child) {
  33. return Opacity(opacity: value, child: child);
  34. },
  35. child: IndexedStack(index: widget.index, children: widget.children),
  36. );
  37. }
  38. }