Flutter floating action button with speed dial

后端 未结 2 1140
半阙折子戏
半阙折子戏 2020-12-04 14:26

Is there any ready made widget or where to get started floating action button with speed dial actions in Flutter.

相关标签:
2条回答
  • 2020-12-04 15:03

    Here's a sketch of how to implement a Speed dial using FloatingActionButton.

    import 'package:flutter/material.dart';
    import 'dart:math' as math;
    
    void main() {
      runApp(new MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          home: new MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      State createState() => new MyHomePageState();
    }
    
    class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
      AnimationController _controller;
    
      static const List<IconData> icons = const [ Icons.sms, Icons.mail, Icons.phone ];
    
      @override
      void initState() {
        _controller = new AnimationController(
          vsync: this,
          duration: const Duration(milliseconds: 500),
        );
      }
    
      Widget build(BuildContext context) {
        Color backgroundColor = Theme.of(context).cardColor;
        Color foregroundColor = Theme.of(context).accentColor;
        return new Scaffold(
          appBar: new AppBar(title: new Text('Speed Dial Example')),
          floatingActionButton: new Column(
            mainAxisSize: MainAxisSize.min,
            children: new List.generate(icons.length, (int index) {
              Widget child = new Container(
                height: 70.0,
                width: 56.0,
                alignment: FractionalOffset.topCenter,
                child: new ScaleTransition(
                  scale: new CurvedAnimation(
                    parent: _controller,
                    curve: new Interval(
                      0.0,
                      1.0 - index / icons.length / 2.0,
                      curve: Curves.easeOut
                    ),
                  ),
                  child: new FloatingActionButton(
                    heroTag: null,
                    backgroundColor: backgroundColor,
                    mini: true,
                    child: new Icon(icons[index], color: foregroundColor),
                    onPressed: () {},
                  ),
                ),
              );
              return child;
            }).toList()..add(
              new FloatingActionButton(
                heroTag: null,
                child: new AnimatedBuilder(
                  animation: _controller,
                  builder: (BuildContext context, Widget child) {
                    return new Transform(
                      transform: new Matrix4.rotationZ(_controller.value * 0.5 * math.pi),
                      alignment: FractionalOffset.center,
                      child: new Icon(_controller.isDismissed ? Icons.share : Icons.close),
                    );
                  },
                ),
                onPressed: () {
                  if (_controller.isDismissed) {
                    _controller.forward();
                  } else {
                    _controller.reverse();
                  }
                },
              ),
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-04 15:16

    This plugin could serve you: https://pub.dartlang.org/packages/flutter_speed_dial

    You need declare the dependency in the pubspect.yaml file

    dependencies:
      flutter:
        sdk: flutter
      flutter_speed_dial: ^1.0.9
    

    Here is an example:

    Widget build(BuildContext context) {
    return Scaffold(
        floatingActionButton: SpeedDial(
          animatedIcon: AnimatedIcons.menu_close,
          animatedIconTheme: IconThemeData(size: 22.0),
          // this is ignored if animatedIcon is non null
          // child: Icon(Icons.add),
          visible: _dialVisible,
          curve: Curves.bounceIn,
          overlayColor: Colors.black,
          overlayOpacity: 0.5,
          onOpen: () => print('OPENING DIAL'),
          onClose: () => print('DIAL CLOSED'),
          tooltip: 'Speed Dial',
          heroTag: 'speed-dial-hero-tag',
          backgroundColor: Colors.white,
          foregroundColor: Colors.black,
          elevation: 8.0,
          shape: CircleBorder(),
          children: [
            SpeedDialChild(
              child: Icon(Icons.accessibility),
              backgroundColor: Colors.red,
              label: 'First',
              labelStyle: TextTheme(fontSize: 18.0),
              onTap: () => print('FIRST CHILD')
            ),
            SpeedDialChild(
              child: Icon(Icons.brush),
              backgroundColor: Colors.blue,
              label: 'Second',
              labelStyle: TextTheme(fontSize: 18.0),
              onTap: () => print('SECOND CHILD'),
            ),
            SpeedDialChild(
              child: Icon(Icons.keyboard_voice),
              backgroundColor: Colors.green,
              label: 'Third',
              labelStyle: TextTheme(fontSize: 18.0),
              onTap: () => print('THIRD CHILD'),
            ),
          ],
        ),
    );
    }
    
    0 讨论(0)
提交回复
热议问题