| 1 | // Copyright 2014 The Flutter Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | import 'package:flutter/material.dart'; |
| 6 | |
| 7 | /// Flutter code sample for [ExpansionTile] and [AnimationStyle]. |
| 8 | |
| 9 | void main() { |
| 10 | runApp(const ExpansionTileAnimationStyleApp()); |
| 11 | } |
| 12 | |
| 13 | enum AnimationStyles { defaultStyle, custom, none } |
| 14 | |
| 15 | const List<(AnimationStyles, String)> animationStyleSegments = <(AnimationStyles, String)>[ |
| 16 | (AnimationStyles.defaultStyle, 'Default' ), |
| 17 | (AnimationStyles.custom, 'Custom' ), |
| 18 | (AnimationStyles.none, 'None' ), |
| 19 | ]; |
| 20 | |
| 21 | class ExpansionTileAnimationStyleApp extends StatefulWidget { |
| 22 | const ExpansionTileAnimationStyleApp({super.key}); |
| 23 | |
| 24 | @override |
| 25 | State<ExpansionTileAnimationStyleApp> createState() => _ExpansionTileAnimationStyleAppState(); |
| 26 | } |
| 27 | |
| 28 | class _ExpansionTileAnimationStyleAppState extends State<ExpansionTileAnimationStyleApp> { |
| 29 | Set<AnimationStyles> _animationStyleSelection = <AnimationStyles>{AnimationStyles.defaultStyle}; |
| 30 | AnimationStyle? _animationStyle; |
| 31 | |
| 32 | @override |
| 33 | Widget build(BuildContext context) { |
| 34 | return MaterialApp( |
| 35 | home: Scaffold( |
| 36 | body: SafeArea( |
| 37 | child: Column( |
| 38 | mainAxisAlignment: MainAxisAlignment.center, |
| 39 | children: <Widget>[ |
| 40 | SegmentedButton<AnimationStyles>( |
| 41 | selected: _animationStyleSelection, |
| 42 | onSelectionChanged: (Set<AnimationStyles> styles) { |
| 43 | setState(() { |
| 44 | _animationStyleSelection = styles; |
| 45 | switch (styles.first) { |
| 46 | case AnimationStyles.defaultStyle: |
| 47 | _animationStyle = null; |
| 48 | case AnimationStyles.custom: |
| 49 | _animationStyle = const AnimationStyle( |
| 50 | curve: Easing.emphasizedAccelerate, |
| 51 | duration: Durations.extralong1, |
| 52 | ); |
| 53 | case AnimationStyles.none: |
| 54 | _animationStyle = AnimationStyle.noAnimation; |
| 55 | } |
| 56 | }); |
| 57 | }, |
| 58 | segments: animationStyleSegments.map<ButtonSegment<AnimationStyles>>(( |
| 59 | (AnimationStyles, String) shirt, |
| 60 | ) { |
| 61 | return ButtonSegment<AnimationStyles>(value: shirt.$1, label: Text(shirt.$2)); |
| 62 | }).toList(), |
| 63 | ), |
| 64 | const SizedBox(height: 20), |
| 65 | ExpansionTile( |
| 66 | expansionAnimationStyle: _animationStyle, |
| 67 | title: const Text('ExpansionTile' ), |
| 68 | children: const <Widget>[ |
| 69 | ListTile(title: Text('Expanded Item 1' )), |
| 70 | ListTile(title: Text('Expanded Item 2' )), |
| 71 | ], |
| 72 | ), |
| 73 | ], |
| 74 | ), |
| 75 | ), |
| 76 | ), |
| 77 | ); |
| 78 | } |
| 79 | } |
| 80 | |