Sample Code & Animation for Flow Widget (#31929)
* Adding sample and animation for Flow widget * Updated dart templates for layout in API docs * Updated the sample code for a clearer example. * make clean
This commit is contained in:
parent
323373d333
commit
20c31e7ac3
@ -4708,6 +4708,128 @@ class Wrap extends MultiChildRenderObjectWidget {
|
|||||||
/// * [CustomMultiChildLayout], which uses a delegate to position multiple
|
/// * [CustomMultiChildLayout], which uses a delegate to position multiple
|
||||||
/// children.
|
/// children.
|
||||||
/// * The [catalog of layout widgets](https://flutter.dev/widgets/layout/).
|
/// * The [catalog of layout widgets](https://flutter.dev/widgets/layout/).
|
||||||
|
///
|
||||||
|
/// {@tool snippet --template=freeform}
|
||||||
|
///
|
||||||
|
/// This example uses the [Flow] widget to create a menu that opens and closes
|
||||||
|
/// as it is interacted with. The color of the button in the menu changes to
|
||||||
|
/// indicate which one has been selected.
|
||||||
|
///
|
||||||
|
/// {@animation 450 100 https://flutter.github.io/assets-for-api-docs/assets/widgets/flow_menu.mp4}
|
||||||
|
///
|
||||||
|
/// ```dart main
|
||||||
|
/// import 'package:flutter/material.dart';
|
||||||
|
///
|
||||||
|
/// void main() => runApp(FlowApp());
|
||||||
|
///
|
||||||
|
/// class FlowApp extends StatelessWidget {
|
||||||
|
/// @override
|
||||||
|
/// Widget build(BuildContext context) {
|
||||||
|
/// return MaterialApp(
|
||||||
|
/// home: Scaffold(
|
||||||
|
/// appBar: AppBar(
|
||||||
|
/// title: const Text('Flow Example'),
|
||||||
|
/// ),
|
||||||
|
/// body: FlowMenu(),
|
||||||
|
/// ),
|
||||||
|
/// );
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// class FlowMenu extends StatefulWidget {
|
||||||
|
/// @override
|
||||||
|
/// _FlowMenuState createState() => _FlowMenuState();
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// class _FlowMenuState extends State<FlowMenu> with SingleTickerProviderStateMixin {
|
||||||
|
/// 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),
|
||||||
|
/// 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: 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 Container(
|
||||||
|
/// child: Flow(
|
||||||
|
/// delegate: FlowMenuDelegate(menuAnimation: menuAnimation),
|
||||||
|
/// children: menuItems.map<Widget>((IconData icon) => flowMenuItem(icon)).toList(),
|
||||||
|
/// ),
|
||||||
|
/// );
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// class FlowMenuDelegate extends FlowDelegate {
|
||||||
|
/// FlowMenuDelegate({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,
|
||||||
|
/// ),
|
||||||
|
/// );
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
/// {@end-tool}
|
||||||
|
///
|
||||||
class Flow extends MultiChildRenderObjectWidget {
|
class Flow extends MultiChildRenderObjectWidget {
|
||||||
/// Creates a flow layout.
|
/// Creates a flow layout.
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user