Skip to content
Flutter plugin to implement a Material Design Speed Dial
Branch: master
Clone or download
Latest commit 85a0493 Jun 5, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
example 1.2.1 Jun 5, 2019
lib Overlay-code removed (was a first try that didn't worked out).. Jun 4, 2019
.gitignore 1.2.1 Jun 5, 2019 update changelog Jun 5, 2019
LICENSE init Jul 7, 2018 Make example compile May 21, 2019
flutter_speed_dial.iml init Jul 7, 2018
pubspec.yaml 1.2.1 Jun 5, 2019

Flutter Speed Dial

Flutter package to render a Material Design Speed Dial.

Flutter Speed Dial


The SpeedDial widget is built to be placed in the Scaffold.floatingActionButton argument, replacing the FloatingActionButton widget. It's not possible to set its position with the Scaffold.floatingActionButtonLocation argument, but it's possible to set right/bottom margin with the marginRight and marginBottom arguments (default to 16) to place the button anywhere in the screen. Using the Scaffold.bottomNavigationBar the floating button will be always placed above the bar, so the BottomAppBar.hasNotch should be always false.


Every child button can have a label, which can be customized providing a labelStyle. If the label parameter is not provided the label will be not rendered.

Animated Icon

The main floating action button child can set with the child parameter, however to make easier to use an AnimatedIcon there are two specific parameters:

  • animatedIcon takes an AnimatedIconData widget
  • animatedIconTheme takes its theme

The package will handle the animation by itself.

Hide on Scroll

Another possibility is to make the button hide on scroll with a curve animation, with a visible parameter to set dynamically based on the scroll direction. See the example project for more info.

Classes API Docs

Example Usage ( complete with all params ):

Widget build(BuildContext context) {
    return Scaffold(
        floatingActionButton: SpeedDial(
          // both default to 16
          marginRight: 18,
          marginBottom: 20,
          animatedIcon: AnimatedIcons.menu_close,
          animatedIconTheme: IconThemeData(size: 22.0),
          // this is ignored if animatedIcon is non null
          // child: Icon(Icons.add),
          visible: _dialVisible,
          // If true user is forced to close dial manually 
          // by tapping main button and overlay is not rendered.
          closeManually: false,
          curve: Curves.bounceIn,
          overlayOpacity: 0.5,
          onOpen: () => print('OPENING DIAL'),
          onClose: () => print('DIAL CLOSED'),
          tooltip: 'Speed Dial',
          heroTag: 'speed-dial-hero-tag',
          backgroundColor: Colors.white,
          elevation: 8.0,
          shape: CircleBorder(),
          children: [
              child: Icon(Icons.accessibility),
              label: 'First',
              labelStyle: TextStyle(fontSize: 18.0),
              onTap: () => print('FIRST CHILD')
              child: Icon(Icons.brush),
              label: 'Second',
              labelStyle: TextStyle(fontSize: 18.0),
              onTap: () => print('SECOND CHILD'),
              child: Icon(Icons.keyboard_voice),
              label: 'Third',
              labelStyle: TextStyle(fontSize: 18.0),
              onTap: () => print('THIRD CHILD'),

Issues & Feedback

Please file an issue to send feedback or report a bug. Thank you!


Every pull request is welcome.

You can’t perform that action at this time.