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
5import 'package:flutter/material.dart';
6
7/// Flutter code sample for [ExpansionTile] and [AnimationStyle].
8
9void main() {
10 runApp(const ExpansionTileAnimationStyleApp());
11}
12
13enum AnimationStyles { defaultStyle, custom, none }
14
15const List<(AnimationStyles, String)> animationStyleSegments = <(AnimationStyles, String)>[
16 (AnimationStyles.defaultStyle, 'Default'),
17 (AnimationStyles.custom, 'Custom'),
18 (AnimationStyles.none, 'None'),
19];
20
21class ExpansionTileAnimationStyleApp extends StatefulWidget {
22 const ExpansionTileAnimationStyleApp({super.key});
23
24 @override
25 State<ExpansionTileAnimationStyleApp> createState() => _ExpansionTileAnimationStyleAppState();
26}
27
28class _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