/* ******************************************
                 *** START***
****************************************** */
import 'package:flutter/material.dart';
class LFLow extends StatefulWidget {
  const LFLow({Key? key}) : super(key: key);
  @override
  State createState() => _LFLowState();
}
class _LFLowState extends State with SingleTickerProviderStateMixin {
  late AnimationController menuAnimation;
  IconData lastTapped = Icons.notifications;
  final List menuItems = [
    Icons.home,
    Icons.camera,
    Icons.chat,
    Icons.map,
    Icons.menu,
  ];
  void _updateMenu(IconData icon) {
    if (icon != Icons.menu) {
      setState(() => lastTapped = icon);
    }
  }
  @override
  void initState() {
    super.initState();
    menuAnimation = AnimationController(
      duration: const Duration(milliseconds: 250),
      vsync: this,
    );
  }
  Widget flowMenuItem(IconData icon) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 8.0),
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: RawMaterialButton(
          fillColor: lastTapped == icon
              ? Theme.of(context).primaryColor
              : Theme.of(context).colorScheme.secondary,
          splashColor: Theme.of(context).colorScheme.primary,
          shape: const CircleBorder(),
          constraints: BoxConstraints.tight(const Size(64, 64)),
          onPressed: () {
            _updateMenu(icon);
            menuAnimation.status == AnimationStatus.completed
                ? menuAnimation.reverse()
                : menuAnimation.forward();
          },
          child: Icon(
            icon,
            color: Colors.white,
            size: 32.0,
          ),
        ),
      ),
    );
  }
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Flow(
        delegate: FlowMenuDelegate(menuAnimation: menuAnimation),
        children: menuItems
            .map((IconData icon) => flowMenuItem(icon))
            .toList(),
      ),
    );
  }
}
class FlowMenuDelegate extends FlowDelegate {
  FlowMenuDelegate({required this.menuAnimation})
      : super(repaint: menuAnimation);
  final Animation menuAnimation;
  @override
  bool shouldRepaint(FlowMenuDelegate oldDelegate) {
    return menuAnimation != oldDelegate.menuAnimation;
  }
  @override
  void paintChildren(FlowPaintingContext context) {
    double dx = 0.0;
    for (int i = 0; i < context.childCount; ++i) {
      dx = context.getChildSize(i)!.width * i;
      context.paintChild(
        i,
        transform: Matrix4.translationValues(
          dx * menuAnimation.value,
          dx * menuAnimation.value,
          dx * menuAnimation.value,
        ),
      );
    }
  }
}
/* ******************************************
*********************************************
*********************************************
              *** END***
*********************************************
*********************************************
****************************************** */
      
