class FlowMenu extends StatefulWidget { const FlowMenu({super.key}); @override State<FlowMenu> createState() => _FlowMenuState(); } class _FlowMenuState extends State<FlowMenu> with SingleTickerProviderStateMixin { late AnimationController menuAnimation; //애니메이션을 제어하기 위한 컨트롤러 IconData lastTapped = Icons.notifications; //마지막으로 선택한 아이콘 final List<IconData> menuItems = <IconData>[ Icons.home, Icons.new_releases, Icons.notifications, Icons.settings, 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), //250ms동안 애니메이션 동작 vsync: this, ); } //메뉴 위젯 Widget flowMenuItem(IconData icon) { final double buttonDiameter = MediaQuery.of(context).size.width / menuItems.length; //버튼 크기 return Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), child: RawMaterialButton( fillColor: lastTapped == icon ? Colors.amber[700] : Colors.blue, splashColor: Colors.amber[100], shape: const CircleBorder(), constraints: BoxConstraints.tight(Size(buttonDiameter, buttonDiameter)), onPressed: () { _updateMenu(icon); //메뉴 변경 menuAnimation.status == AnimationStatus.completed ? menuAnimation.reverse() : menuAnimation.forward(); //애니메이션 동작 }, child: Icon( icon, color: Colors.white, size: 45.0, ), ), ); } @override Widget build(BuildContext context) { return Flow( delegate: FlowMenuDelegate(menuAnimation: menuAnimation), //대리자 지정 children: menuItems.map<Widget>((IconData icon) => flowMenuItem(icon)).toList(), ); } } class FlowMenuDelegate extends FlowDelegate { FlowMenuDelegate({required this.menuAnimation}) : super(repaint: menuAnimation); final Animation<double> 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, 0, 0,), ); } } }
Flutter란? 구글에서 개발한 크로스 플랫폼 모바일 앱 개발 프레임워크 Flutter의 장점 빠르다. Flutter 코드는 ARM 또는 Intel 기계어 코드와 JavaScript로 컴파일되어 모든 장치에서 빠른 성능을 제공한다. 생산적이다. Hot Reload 기능을 ...
위젯(Widget)이란? UI를 구성하는 기본 단위 사용자 인터페이스의 모든 요소는 위젯으로 표현된다. 종류 Stateless Widget Stateful Widget Stateless Widget 앱이 동작하면서 변하지 않는 위젯 가장 기본적인 위젯의 형태 기본 위젯들은 S...
puspec.yaml 프로젝트에 대한 정의 및 패키지 의존성 관리 등의 역할을 하는 파일 참고 예시 name: example description: "A new Flutter project." publish_to: 'none' # Remove this line if you wish to publish to pub.dev version...
배너
비동기 데이터 처리하기
새 버전의 콘텐츠를 사용할 수 있습니다.