Simple and configurable app introduction slider for Flutter

Overview

FLUTTER INTRO SLIDER

Flutter Intro Slider is a flutter plugin that helps you make a cool intro for your app. Create intro has never been easier and faster

Table of Contents

Installing

Add to pubspec.yaml file

dependencies:
  intro_slider: ^3.0.2

Import

import 'package:intro_slider/intro_slider.dart';

Demo

default custom 1 custom 2

Code example

Default config

default config image

Code example (click to expand)
class IntroScreenState extends State<IntroScreen> {
  List<Slide> slides = [];

  @override
  void initState() {
    super.initState();

    slides.add(
      new Slide(
        title: "ERASER",
        description: "Allow miles wound place the leave had. To sitting subject no improve studied limited",
        pathImage: "images/photo_eraser.png",
        backgroundColor: Color(0xfff5a623),
      ),
    );
    slides.add(
      new Slide(
        title: "PENCIL",
        description: "Ye indulgence unreserved connection alteration appearance",
        pathImage: "images/photo_pencil.png",
        backgroundColor: Color(0xff203152),
      ),
    );
    slides.add(
      new Slide(
        title: "RULER",
        description:
            "Much evil soon high in hope do view. Out may few northward believing attempted. Yet timed being songs marry one defer men our. Although finished blessing do of",
        pathImage: "images/photo_ruler.png",
        backgroundColor: Color(0xff9932CC),
      ),
    );
  }

  void onDonePress() {
    // Do what you want
    print("End of slides");
  }

  @override
  Widget build(BuildContext context) {
    return new IntroSlider(
      slides: this.slides,
      onDonePress: this.onDonePress,
    );
  }
}

Custom config

custom config image

Code example (click to expand)
class IntroScreenState extends State<IntroScreen> {
  List<Slide> slides = [];

  @override
  void initState() {
    super.initState();

    slides.add(
      new Slide(
        title:
            "A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE A VERY LONG TITLE",
        maxLineTitle: 2,
        styleTitle:
            TextStyle(color: Colors.white, fontSize: 30.0, fontWeight: FontWeight.bold, fontFamily: 'RobotoMono'),
        description:
            "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,",
        styleDescription:
            TextStyle(color: Colors.white, fontSize: 20.0, fontStyle: FontStyle.italic, fontFamily: 'Raleway'),
        marginDescription: EdgeInsets.only(left: 20.0, right: 20.0, top: 20.0, bottom: 70.0),
        centerWidget: Text("Replace this with a custom widget", style: TextStyle(color: Colors.white)),
        backgroundImage: "images/forest.png",
        directionColorBegin: Alignment.topLeft,
        directionColorEnd: Alignment.bottomRight,
        onCenterItemPress: () {},
      ),
    );
    slides.add(
      new Slide(
        title: "CITY",
        styleTitle:
            TextStyle(color: Color(0xff7FFFD4), fontSize: 30.0, fontWeight: FontWeight.bold, fontFamily: 'RobotoMono'),
        description: "Ye indulgence unreserved connection alteration appearance",
        styleDescription:
            TextStyle(color: Color(0xff7FFFD4), fontSize: 20.0, fontStyle: FontStyle.italic, fontFamily: 'Raleway'),
        backgroundImage: "images/city.jpeg",
        directionColorBegin: Alignment.topRight,
        directionColorEnd: Alignment.bottomLeft,
      ),
    );
    slides.add(
      new Slide(
        title: "BEACH",
        styleTitle:
            TextStyle(color: Color(0xffFFDAB9), fontSize: 30.0, fontWeight: FontWeight.bold, fontFamily: 'RobotoMono'),
        description:
            "Much evil soon high in hope do view. Out may few northward believing attempted. Yet timed being songs marry one defer men our. Although finished blessing do of",
        styleDescription:
            TextStyle(color: Color(0xffFFDAB9), fontSize: 20.0, fontStyle: FontStyle.italic, fontFamily: 'Raleway'),
        backgroundImage: "images/beach.jpeg",
        directionColorBegin: Alignment.topCenter,
        directionColorEnd: Alignment.bottomCenter,
        maxLineTextDescription: 3,
      ),
    );
  }

  void onDonePress() {
    // Do what you want
    // Navigator.push(
    //   context,
    //   MaterialPageRoute(builder: (context) => HomeScreen()),
    // );
  }

  Widget renderNextBtn() {
    return Icon(
      Icons.navigate_next,
      color: Color(0xffF3B4BA),
      size: 35.0,
    );
  }

  Widget renderDoneBtn() {
    return Icon(
      Icons.done,
      color: Color(0xffF3B4BA),
    );
  }

  Widget renderSkipBtn() {
    return Icon(
      Icons.skip_next,
      color: Color(0xffF3B4BA),
    );
  }

  ButtonStyle myButtonStyle() {
    return ButtonStyle(
      shape: MaterialStateProperty.all<OutlinedBorder>(StadiumBorder()),
      backgroundColor: MaterialStateProperty.all<Color>(Color(0x33F3B4BA)),
      overlayColor: MaterialStateProperty.all<Color>(Color(0x33FFA8B0)),
    );
  }

  @override
  Widget build(BuildContext context) {
    return new IntroSlider(
      // List slides
      slides: this.slides,

      // Skip button
      renderSkipBtn: this.renderSkipBtn(),
      skipButtonStyle: myButtonStyle(),

      // Next button
      renderNextBtn: this.renderNextBtn(),
      nextButtonStyle: myButtonStyle(),

      // Done button
      renderDoneBtn: this.renderDoneBtn(),
      onDonePress: this.onDonePress,
      doneButtonStyle: myButtonStyle(),

      // Dot indicator
      colorDot: Color(0x33FFA8B0),
      colorActiveDot: Color(0xffFFA8B0),
      sizeDot: 13.0,

      // Show or hide status bar
      hideStatusBar: true,
      backgroundColorAllSlides: Colors.grey,

      // Scrollbar
      verticalScrollbarBehavior: scrollbarBehavior.SHOW_ALWAYS,
    );
  }
}

Custom your own tabs

custom config image

Code example (click to expand)
class IntroScreenState extends State<IntroScreen> {
  List<Slide> slides = [];

  Function goToTab;

  @override
  void initState() {
    super.initState();

    slides.add(
      new Slide(
        title: "SCHOOL",
        styleTitle: TextStyle(
          color: Color(0xff3da4ab),
          fontSize: 30.0,
          fontWeight: FontWeight.bold,
          fontFamily: 'RobotoMono',
        ),
        description:
            "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa.",
        styleDescription:
            TextStyle(color: Color(0xfffe9c8f), fontSize: 20.0, fontStyle: FontStyle.italic, fontFamily: 'Raleway'),
        pathImage: "images/photo_school.png",
      ),
    );
    slides.add(
      new Slide(
        title: "MUSEUM",
        styleTitle:
            TextStyle(color: Color(0xff3da4ab), fontSize: 30.0, fontWeight: FontWeight.bold, fontFamily: 'RobotoMono'),
        description: "Ye indulgence unreserved connection alteration appearance",
        styleDescription:
            TextStyle(color: Color(0xfffe9c8f), fontSize: 20.0, fontStyle: FontStyle.italic, fontFamily: 'Raleway'),
        pathImage: "images/photo_museum.png",
      ),
    );
    slides.add(
      new Slide(
        title: "COFFEE SHOP",
        styleTitle:
            TextStyle(color: Color(0xff3da4ab), fontSize: 30.0, fontWeight: FontWeight.bold, fontFamily: 'RobotoMono'),
        description:
            "Much evil soon high in hope do view. Out may few northward believing attempted. Yet timed being songs marry one defer men our. Although finished blessing do of",
        styleDescription:
            TextStyle(color: Color(0xfffe9c8f), fontSize: 20.0, fontStyle: FontStyle.italic, fontFamily: 'Raleway'),
        pathImage: "images/photo_coffee_shop.png",
      ),
    );
  }

  void onDonePress() {
    // Back to the first tab
    this.goToTab(0);
  }

  void onTabChangeCompleted(index) {
    // Index of current tab is focused
    print(index);
  }

  Widget renderNextBtn() {
    return Icon(
      Icons.navigate_next,
      color: Color(0xffffcc5c),
      size: 35.0,
    );
  }

  Widget renderDoneBtn() {
    return Icon(
      Icons.done,
      color: Color(0xffffcc5c),
    );
  }

  Widget renderSkipBtn() {
    return Icon(
      Icons.skip_next,
      color: Color(0xffffcc5c),
    );
  }

  ButtonStyle myButtonStyle() {
    return ButtonStyle(
      shape: MaterialStateProperty.all<OutlinedBorder>(StadiumBorder()),
      backgroundColor: MaterialStateProperty.all<Color>(Color(0x33ffcc5c)),
      overlayColor: MaterialStateProperty.all<Color>(Color(0x33ffcc5c)),
    );
  }

  List<Widget> renderListCustomTabs() {
    List<Widget> tabs = [];
    for (int i = 0; i < slides.length; i++) {
      Slide currentSlide = slides[i];
      tabs.add(Container(
        width: double.infinity,
        height: double.infinity,
        child: Container(
          margin: EdgeInsets.only(bottom: 60.0, top: 60.0),
          child: ListView(
            children: <Widget>[
              GestureDetector(
                  child: Image.asset(
                currentSlide.pathImage,
                width: 200.0,
                height: 200.0,
                fit: BoxFit.contain,
              )),
              Container(
                child: Text(
                  currentSlide.title,
                  style: currentSlide.styleTitle,
                  textAlign: TextAlign.center,
                ),
                margin: EdgeInsets.only(top: 20.0),
              ),
              Container(
                child: Text(
                  currentSlide.description,
                  style: currentSlide.styleDescription,
                  textAlign: TextAlign.center,
                  maxLines: 5,
                  overflow: TextOverflow.ellipsis,
                ),
                margin: EdgeInsets.only(top: 20.0),
              ),
            ],
          ),
        ),
      ));
    }
    return tabs;
  }

  @override
  Widget build(BuildContext context) {
    return new IntroSlider(
      // Skip button
      renderSkipBtn: this.renderSkipBtn(),
      skipButtonStyle: myButtonStyle(),

      // Next button
      renderNextBtn: this.renderNextBtn(),
      nextButtonStyle: myButtonStyle(),

      // Done button
      renderDoneBtn: this.renderDoneBtn(),
      onDonePress: this.onDonePress,
      doneButtonStyle: myButtonStyle(),

      // Dot indicator
      colorDot: Color(0xffffcc5c),
      sizeDot: 13.0,
      typeDotAnimation: dotSliderAnimation.SIZE_TRANSITION,

      // Tabs
      listCustomTabs: this.renderListCustomTabs(),
      backgroundColorAllSlides: Colors.white,
      refFuncGoToTab: (refFunc) {
        this.goToTab = refFunc;
      },

      // Behavior
      scrollPhysics: BouncingScrollPhysics(),

      // Show or hide status bar
      hideStatusBar: true,

      // On tab change completed
      onTabChangeCompleted: this.onTabChangeCompleted,
    );
  }
}

Slide object properties

Name Type Default Description
Title
title String? "" Change text title at top
widgetTitle Widget? null Set a custom widget as the title (ignore title if define both)
maxLineTitle int? 1 Change max number of lines title at top
styleTitle TextStyle? White color, bold and font size is 30.0 Style for text title
marginTitle EdgeInsets? top: 70.0, bottom: 50.0 Margin for text title
Image
pathImage String? "" Path to your local image
widthImage double? 250.0 Width of image
heightImage double? 250.0 Height of image
foregroundImageFit BoxFit? BoxFit.contain Foreground image fit
Center widget
centerWidget Widget? null Your custom's widget
onCenterItemPress Function()? Do nothing Fire when press center image/widget
Description
description String? "" Change text description at bottom
widgetDescription Widget? null Set a custom widget as the description (ignore description if define both)
maxLineTextDescription int? 100 Maximum line of text description
styleDescription TextStyle? White and font size is 18.0 Style for text description
marginDescription EdgeInsets? left, right = 20.0, top, bottom = 50.0 Margin for text description
Background Color
backgroundColor Color? Colors.amberAccent Background tab color
colorBegin Color? Colors.amberAccent Gradient tab color begin
colorEnd Color? Colors.amberAccent Gradient tab color end
directionColorBegin AlignmentGeometry? Alignment.topLeft Direction color begin
directionColorEnd AlignmentGeometry? Alignment.bottomRight Direction color end
Background Image
backgroundImage String? null Background tab image
backgroundImageFit BoxFit? BoxFit.cover Background tab image fit
backgroundOpacity double? 0.5 Background tab image filter opacity
backgroundOpacityColor Color? Colors.black Background tab image filter color
backgroundBlendMode BlendMode? BlendMode.darken Background tab image filter blend mode

IntroSlider widget properties

Name Type Default Description
Slide
slides Slide No default, require if listCustomTabs not defined An array of Slide object
Skip Button
renderSkipBtn Widget? Button with white text SKIP Render your own widget SKIP button
skipButtonStyle ButtonStyle? ButtonStyle() Style for SKIP button
onSkipPress void Function()? Go to last page Fire when press SKIP button
skipButtonStyle ButtonStyle? ButtonStyle() Style for SKIP button
showSkipBtn bool? true Show or hide SKIP button
Previous Button
renderPrevBtn Widget? Button with white text PREV Render your own PREV button
prevButtonStyle ButtonStyle? ButtonStyle() Style for PREV button
showPrevBtn bool? false Show or hide PREV, have to set showSkipBtn to false at first if you want to show this button
Done Button
renderDoneBtn Widget? Button with white text DONE Render your own DONE button
doneButtonStyle ButtonStyle? ButtonStyle() Style for DONE button
onDonePress void Function()? Do nothing Fire when press DONE button
showDoneBtn bool? true Show or hide DONE button
Next Button
renderNextBtn Widget? Button with white text NEXT Render your own NEXT button
nextButtonStyle ButtonStyle? ButtonStyle() Style for NEXT button
showNextBtn bool? true Show or hide NEXT button
Dot Indicator
showDotIndicator bool? true Show or hide dot indicator
colorDot Color? Color(0x80000000) Color for dot when passive
colorActiveDot Color? Color(0xffffffff) Color for dot when active
sizeDot double? 8.0 Size of each dot
typeDotAnimation (inactive dots auto have opacity 50%,
dot active has size bigger than 1.5 times )
enum dotSliderAnimation? dotSliderAnimation.DOT_MOVEMENT Type dots animation
Tabs
listCustomTabs List<Widget>? null Render your own list tabs (use default tab UI if not defined)
refFuncGoToTab void Function(Function function)? Do nothing Send the reference of change tab's function,
then we can move to any tab index programmatically
onTabChangeCompleted void Function(int index)? Do nothing Callback when tab change comleted, return the current tab's index
backgroundColorAllSlides Color? Transparent Background color for all slides
Behavior
isScrollable bool? true Force button-only scrolling
scrollPhysics ScrollPhysics? ScrollPhysics() Determines the physics horizontal scroll for the slide
verticalScrollbarBehavior enum scrollbarBehavior? scrollbarBehavior.HIDE Allow to specify how the vertical scrollbar should behave
hideStatusBar bool? false Show or hide the status bar

Pull request and feedback are always appreciated

Comments
  • Intro Slider overlaps primary application MaterialApp

    Intro Slider overlaps primary application MaterialApp

    Hi @duytq94 !

    First of all thank you for creating this plugin and for bringing back onSkipPress on 1.2.1 :) Since IntroSlider builds itself using a MaterialApp, it overlaps the primary application MaterialApp, removing it's title and theme and other properties. Is there a way to prevent this?

    Best regards, freitzzz

    opened by freitzzz 11
  • Suggestion: color options to be instances of `Color` rather than `int`

    Suggestion: color options to be instances of `Color` rather than `int`

    Great package! I would however suggest that perhaps instead of using ints for color config, you use Colour instances directly. This would bring it inline with Flutter's inbuilt widgets. Eg.

    Flutter's app bar..

    AppBar(
     backgroundColor: Colors.white
     [....]
    )
    

    Changing to using colors like this will more easily allow for colors to be pulled out of the App's theme object. I would be happy to make this change if it's a direction that you're happy with.

    opened by jacobimpson 9
  • chore(Rebuild) fix issue StatefulWidget not rebuild when parent update

    chore(Rebuild) fix issue StatefulWidget not rebuild when parent update

    Hi @duytq94 We need localize for this screen intro_slider. but when I change language and rebuild this screen, it not change.

    please review this issue.

    opened by trunghieuvn 7
  • setState doesn't update the ui

    setState doesn't update the ui

    Hello developer,

    thank you for the nice package your developed,

    I created some intro slides following your tutorial, in the first slide I have a DropdownButton I use to change my app language. on value change of the drop down button I call setState to rebuild the slide with new changes applied to it.

    but the problem is now matter how I tried, setState never update the UI. I don't know why. I hope you have a fix for that.

    Thank you

    opened by ramioooz 6
  • invalid value  occurs 'not in range 0..2, inclusive :3'

    invalid value occurs 'not in range 0..2, inclusive :3'

    ════════ Exception Caught By widgets library ═══════════════════════════════════════════════════════ The following RangeError was thrown building IntroSlider(dirty, dependencies: [MediaQuery, _LocalizationsScope-[GlobalKey#5ac6e]], state: IntroSliderState#7ffc0(ticker inactive)): RangeError (index): Invalid value: Not in range 0..2, inclusive: 3 When the exception was thrown, this was the stack: #0 List.[] (dart:core-patch/growable_array.dart:145:60) #1 IntroSliderState.renderListDots (package:intro_slider/intro_slider.dart:1039:34) #2 IntroSliderState.renderBottom (package:intro_slider/intro_slider.dart:829:42) #3 IntroSliderState.build (package:intro_slider/intro_slider.dart:737:13) #4 StatefulElement.build (package:flutter/src/widgets/framework.dart:4012:27)

    opened by johnDivek 6
  • How to set image to full width?

    How to set image to full width?

    Hi, I want to give a foreground image in the slide the full width of the viewport.

    The original image size is 1500 x 2200. I tried to set widthImage: 1500, but the image stays very small in the center, it doesn't stretch to full width.

    When I also set a heightImage, the image stretches. But I just want to give it the full width. Something like foregroundImageFit: BoxFit.contain would be great!

    How can I do this?

    Thanks, Michael

    opened by momsenmeister 6
  • MySplashScreen error

    MySplashScreen error

    I inserted all necessary configuration to my main.dart but getting this error:

    schermata 2019-02-14 alle 20 00 49

    My main.dart file

    import 'package:histic/fab_with_icons.dart';
    import 'package:histic/fab_bottom_app_bar.dart';
    import 'package:histic/layout.dart';
    import 'package:flutter/material.dart';
    import './tabs/home.dart' as _firstTab;
    import './tabs/explore.dart' as _secondTab;
    import './tabs/profile.dart' as _thirdTab;
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/services.dart';
    import 'dart:math' as math;
    import 'theme.dart' as Theme;
    import 'package:share/share.dart';
    import 'package:intro_slider/intro_slider.dart';
    
    
    void main() => runApp(new MyApp());
    
    
    
    class MyApp extends StatelessWidget {
    
    
    
    
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        
        return new MaterialApp(
    
      
    
          
    
          // ...
          title: 'Histic',
          debugShowCheckedModeBanner: false,
          
          
          theme: new ThemeData(
            // This is the theme of your application.
            //
            // Try running your application with "flutter run". You'll see the
            // application has a blue toolbar. Then, without quitting the app, try
            // changing the primarySwatch below to Colors.green and then invoke
            // "hot reload" (press "r" in the console where you ran "flutter run",
            // or press Run > Flutter Hot Reload in IntelliJ). Notice that the
            // counter didn't reset back to zero; the application is not restarted.
            primarySwatch:Theme.CompanyColors.red,
    
          ),
    
          
    
          home: new MyHomePage(
           title: 'Histic'
    
          
          ),
        );
    
    
    
      }
    
      
    
    
    }
    
    class AboutRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('About'),
          ),
          body: Center(
            child: RaisedButton(
              child: Text('Open route'),
              onPressed: () {
                // Navigate to second route when tapped.
              },
              
            ),
            
          ),
    
          
        );
    
        
      }
    }
    
    class SettingsRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Settings"),
          ),
          body: Center(
            child: RaisedButton(
              onPressed: () {
                // Navigate back to first route when tapped.
              },
              child: Text('Go back!'),
            ),
          ),
        );
      }
    }
    
    class HelpRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Help'),
          ),
          body: Center(
            child: RaisedButton(
              child: Text('Open route'),
              onPressed: () {
                // Navigate to second route when tapped.
              },
            ),
          ),
        );
      }
    }
    
    class MySplashScreenState extends State<MySplashScreen> {
      List<Slide> slides = new List();
    
      @override
      void initState() {
        super.initState();
    
        slides.add(
          new Slide(
            title: "ERASER",
            description: "Allow miles wound place the leave had. To sitting subject no improve studied limited",
            pathImage: "images/photo_eraser.png",
            backgroundColor: Color(0xfff5a623),
          ),
        );
        slides.add(
          new Slide(
            title: "PENCIL",
            description: "Ye indulgence unreserved connection alteration appearance",
            pathImage: "images/photo_pencil.png",
            backgroundColor: Color(0xff203152),
          ),
        );
        slides.add(
          new Slide(
            title: "RULER",
            description:
                "Much evil soon high in hope do view. Out may few northward believing attempted. Yet timed being songs marry one defer men our. Although finished blessing do of",
            pathImage: "images/photo_ruler.png",
            backgroundColor: Color(0xff9932CC),
          ),
        );
      }
    
      void onDonePress() {
        // TODO: go to next screen
      }
    
      void onSkipPress() {
        // TODO: go to next screen
      }
    
      @override
      Widget build(BuildContext context) {
        return new IntroSlider(
          slides: this.slides,
          onDonePress: this.onDonePress,
          onSkipPress: this.onSkipPress,
        );
      }
    }
    
    
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
      String _lastSelected = 'TAB: 0';
    
      void _selectedTab(int index) {
        setState(() {
          _lastSelected = 'TAB: $index';
        });
      }
    
      void _selectedFab(int index) {
        setState(() {
          _lastSelected = 'FAB: $index';
        });
      }
    
      @override
      Widget build(BuildContext context) {
    
    
        return Scaffold(
          appBar: AppBar(
            title: new Image.asset('assets/histic_land_transparent.png', fit: BoxFit.cover),
    
            actions: <Widget>[
              
            ],
    
            
    
          ),
          drawer: new Drawer(
    
                
    
            child: new ListView(
              children: <Widget>[
    
                new ListTile(
                  title: new Text(
                      "Histic",
                    style: TextStyle(fontWeight: FontWeight.bold, fontSize:40),
    
    
                  ),
    
                  subtitle: Text('BETA'),
                ),
    
                Divider(),
    
                new ListTile(
                  title: new Text("Send Feedback"),
                  trailing: new Icon(Icons.feedback),
                ),
    
     
    
                Divider(),
    
                new ListTile(
                  
    
                  title: new Text("Invite friends"),
                  trailing: new Icon(Icons.share),
                  onTap: () {
                    Share.share('Histic — Discuss about your favorite topics');
                  }
                ),
                Divider(),
                new ListTile(
                  title: new Text("Settings"),
                  trailing: new Icon(Icons.settings),
                  onTap: () {
                    Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => SettingsRoute()),
      );
    
                  }
                  
                ),
                new ListTile(
                  title: new Text("About"),
                  trailing: new Icon(Icons.info),
                  onTap: () {
                    Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => AboutRoute()),
      );
    
                  }
                ),
                new ListTile(
                  title: new Text("Help"),
                  trailing: new Icon(Icons.help),
                  onTap: () {
                    Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => HelpRoute()),
      );
    
                  }
                ),
    
              ]
            ),
          ),
          body: Center(
            child: Text(
              _lastSelected,
              style: TextStyle(fontSize: 32.0),
            ),
          ),
          bottomNavigationBar: FABBottomAppBar(
            color: Colors.grey,
            selectedColor: Theme.CompanyColors.red,
            notchedShape: CircularNotchedRectangle(),
            onTabSelected: _selectedTab,
            items: [
              FABBottomAppBarItem(iconData: Icons.home, text: 'Home'),
              FABBottomAppBarItem(iconData: Icons.explore, text: 'Explore'),
              FABBottomAppBarItem(iconData: Icons.notifications, text: 'Bell'),
              FABBottomAppBarItem(iconData: Icons.person, text: 'Profile'),
            ],
          ),
          floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
          floatingActionButton: _buildFab(
              context), // This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    
    
    
      Widget _buildFab(BuildContext context) {
    
        final icons = [ Icons.phone, Icons.mail, Icons.phone ];
        return AnchoredOverlay(
          showOverlay: true,
          overlayBuilder: (context, offset) {
            return CenterAbout(
              position: Offset(offset.dx, offset.dy - icons.length * 35.0),
              child: FabWithIcons(
                icons: icons,
                onIconTapped: _selectedFab,
              ),
            );
          },
          child: FloatingActionButton(
            onPressed: () {
            },
            tooltip: 'Actions',
            child: Icon(Icons.add),
            elevation: 2.0,
          ),
        );
      }
    }
    
    
    help wanted 
    opened by ardacebi 6
  • renderDoneBtn and other should't be default TextButton

    renderDoneBtn and other should't be default TextButton

    Hey ! Thanks for your hard work on this awesome library !

    I've noticed that all buttons, even if you define your own widget, are default TextButtons. I think that's rather confusing and should be only the case if only nameNextBtn is set. Building the widget just as given would give us the chance to adjust the button for next and others like I'm trying to do.

    Let me know what do you think. Thank you!

    opened by Fintasys 5
  • Add button within the slide

    Add button within the slide

    Is it possible to add a button to each slide after the description? I wanted to add a button with the label "More" which would display a bottom sheet modal with additional text to explain in more detail the text shown on the slide.

    opened by johnareid54 5
  • onDonePress button isnt disabled on

    onDonePress button isnt disabled on "null" callback

    The "Done" Button should be disabled if it receives a null callback. Currently that is missing.

    onDonePress: !isConnectedtoInet ? null : () { if (_formKey.currentState.validate()) { this.onDonePress(); } }

    opened by marcmarder 5
  • [web] 4.0.0 lost web support

    [web] 4.0.0 lost web support

    When upgrading from 3.0.10 to 4.0.0 the package lost support for web. I am getting Unsupported operation: Platform._operatingSystem on 4.0.0 on web, whereas on 3.0.10 the package works perfectly fine on all platforms.

    Flutter 3.3.2

    opened by SirBarksALot 4
  • [macos]: Failed assertion: line 267 pos 15: 'margin == null || margin.isNonNegative': is not true.

    [macos]: Failed assertion: line 267 pos 15: 'margin == null || margin.isNonNegative': is not true.

    'package:flutter/src/widgets/container.dart': Failed assertion: line 267 pos 15: 'margin == null || margin.isNonNegative': is not true.
          #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
          #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
          #2      new Container (package:flutter/src/widgets/container.dart:267:15)
          #3      IntroSliderState.renderNav (package:intro_slider/src/intro_slider_widget.dart:664:34)
          #4      IntroSliderState.build (package:intro_slider/src/intro_slider_widget.dart:572:13)
          #5      StatefulElement.build (package:flutter/src/widgets/framework.dart:4992:27)
          #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4878:15)
          #7      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #8      Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #9      StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #10     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #11     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #12     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #13     StatelessElement.update (package:flutter/src/widgets/framework.dart:4956:5)
          #14     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #15     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #16     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #17     StatelessElement.update (package:flutter/src/widgets/framework.dart:4956:5)
          #18     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #19     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #20     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #21     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #22     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #24     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #25     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #26     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #27     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5904:32)
          #28     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6460:17)
          #29     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #30     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #31     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #32     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #33     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #34     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #35     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #36     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #37     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #38     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #39     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #40     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #41     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #42     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #43     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #45     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #46     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #47     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #48     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #49     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #50     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #51     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #52     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #53     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6307:14)
          #54     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #56     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #57     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #58     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #59     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6307:14)
          #60     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #61     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #62     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #63     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #64     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #65     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #66     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #67     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #68     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #69     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #70     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #71     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #72     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #73     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #74     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #75     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #76     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #77     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #78     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #79     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #80     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #81     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #82     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #83     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #84     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #85     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #86     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #87     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #88     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #89     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #90     ProxyElement.update (package:flutter/src/widgets/framework.dart:5228:5)
          #91     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #92     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #93     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #94     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #95     StatefulElement.update (package:flutter/src/widgets/framework.dart:5082:5)
          #96     Element.updateChild (package:flutter/src/widgets/framework.dart:3570:15)
          #97     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4904:16)
          #98     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5050:11)
          #99     Element.rebuild (package:flutter/src/widgets/framework.dart:4604:5)
          #100    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2667:19)
          #101    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
          #102    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:378:5)
          #103    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1175:15)
          #104    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1104:9)
          #105    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:881:7)
          #106    Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
          #107    _Timer._runTimers (dart:isolate-patch/timer_impl.dart:398:19)
          #108    _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
          #109    _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
    
    opened by kw214 7
  • Check/Validation on Swipe/Next

    Check/Validation on Swipe/Next

    Hi!

    Is there a recommended/best practice way for hooking into the goToTab() method?

    What I like to do is to perform a validation, before a user can proceed to the next slide, like for example a login or license code check.

    I tried to solve this with refFuncGoToTab - but I couldn't get it to work and I didn't find further documentation about it...

    I can offer to implement this myself and make a pull request if you like and think it would be in scope for your plugin.

    Cheers, Phil

    opened by philcoffeejunkie 2
  • How to customize

    How to customize

    Is it possible to customize the Skip button position? By design I want it to be at the top right corner. Is it possible to use Dots indicator separately? Because I already have a self-written intro screen and want these fancy animated dots.

    opened by subzero911 1
  • Getting different output in debug and release mode.

    Getting different output in debug and release mode.

    After running this project in the emulator, then I built a fresh flutter project to make some UI customization according to requirements the app is running fine in the emulator (debug mode), but when I build release apk to test it in my device the layout is overlapping with each other and I'm not getting the proper output. I'm running the same code which is defined in this repository. Please help..!

    flutter doctor -v
    

    [✓] Flutter (Channel stable, 1.20.2, on Mac OS X 10.15.6 19G2021, locale en-IN) • Flutter version 1.20.2 at /Users/sureshkerai/AndroidStudioProjects/flutter • Framework revision bbfbf1770c (3 weeks ago), 2020-08-13 08:33:09 -0700 • Engine revision 9d5b21729f • Dart version 2.9.1

    [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.1) • Android SDK at /Users/sureshkerai/Library/Android/sdk • Platform android-30, build-tools 30.0.1 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) • All Android licenses accepted.

    [✓] Xcode - develop for iOS and macOS (Xcode 11.6) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 11.6, Build version 11E708 • CocoaPods version 1.9.3

    [✓] Android Studio (version 4.0) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 48.1.2 • Dart plugin version 193.7547 • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

    [✓] VS Code (version 1.48.2) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.13.2

    [✓] Connected device (1 available) • AOSP on IA Emulator (mobile) • emulator-5554 • android-x86 • Android 9 (API 28) (emulator)

    • No issues found!

    • The output I got (release mode)

    Screenshot_20200903-135336

    • The output I want (debug mode)

    Screenshot_20200903-135210

    opened by darshitArkay 0
  • Make compatible with hot reload

    Make compatible with hot reload

    I'd like to resurrect https://github.com/duytq94/flutter-intro-slider/issues/18 because indeed hot reload would be very useful. For me, it's not working even when I use the suggested

    Navigator.pushReplacement(
            context, MaterialPageRoute(builder: (context) => IntroScreen()));
    
    opened by saddy001 7
Releases(3.0.4)
IntroAnimationSlider - A simple Flutte Animation Introduction for Mobile app easy to implement Using intro Views flutter

introappanimation simple Flutte Animation Introduction for Mobile app easy to im

null 3 Sep 22, 2022
Sample Flutter Drawing App which allows the user to draw onto the canvas along with color picker and brush thickness slider.

DrawApp Sample Flutter Drawing App which allows the user to draw onto the canvas along with color picker and brush thickness slider. All code free to

Jake Gough 226 Nov 3, 2022
A custom Flutter value slider that makes a wave effect when dragged.

A Flutter slider that makes a wave effect when dragged. Does a little bounce when dropped. Demo Getting Started To use this plugin, add wave_slider as

Gordon Hayes 33 Dec 21, 2022
Bubbleslider - A flutter package support a slider customize UI with bubble animation

bubble_slider This package support a slider customize UI with bubble animation.

MindInventory 11 Jul 26, 2022
PaperOnboarding is a material design slider made by @Ramotion

PAPER ONBOARDING Android library Paper Onboarding is a material design UI slider written on Java We specialize in the designing and coding of custom U

Ramotion 2.6k Dec 28, 2022
A simple animated circular menu for Flutter, Adjustable radius, colors, alignment, animation curve and animation duration.

A simple animated circular menu for Flutter, Adjustable radius, colors, alignment, animation curve and animation duration. pub package Getting Started

Hasan Mohammed 91 Dec 20, 2022
Making drawings and animations in Flutter extremely simple

?? GraphX™ | rendering | prototype | design | Making drawings and animations in Flutter extremely simple. wiki-tips. To get some extended, boring expl

Roi Peker 382 Dec 21, 2022
A light weight library to easily manage a progress dialog with simple steps whenever you need to do it. You can easily show and hide it.

progress_dialog A light weight package to show progress dialog. As it is a stateful widget, you can change the text shown on the dialog dynamically. T

Mohammad Fayaz 202 Dec 11, 2022
A simple quiz app for flutter web

exercicios A beginner flutter project Getting Started Pré-requisitos Antes de começar, você vai precisar ter instalado em sua máquina as seguintes fer

null 0 Dec 13, 2021
A windows only app to keep your folders password protected with a simple batch script.

SecureFolder About SecureFolder is a Windows OS only app that makes password protected folders which you can access easily. It uses the latest Windows

dhzdhd 2 Sep 21, 2022
Simple reactive animations in your Flutter apps.

just.motion Flutter package to create organic motion transitions. Why? The Motion Value stateless hot reload status notifier Ease Motion Spring Motion

Roi Peker 49 Nov 14, 2022
A Flutter package with a selection of simple yet very customizable set of loading animations.

Flutter Loading Animations A simple yet very customizable set of loading animations for Flutter projects. Installation Add the following to your pubsp

Andre Cytryn 171 Sep 23, 2022
Flutter Spring -simple & power full animation kit

A simple & powerfull pre-built animation kit. ?? Installation dependencies: spring: ^2.0.2 ?? Spring Animations Slide Scale Animated Card Flip Fa

null 51 Sep 25, 2022
A simple toggle switch widget for Flutter.

Toggle Switch A simple toggle switch widget. It can be fully customized with desired icons, width, colors, text, corner radius, animation etc. It also

Pramod Joshi 84 Nov 20, 2022
A simple login UI written in flutter

login_ui A simple Flutter login ui. Sign in screen Sign up screen

Mohammad Saleh 7 Nov 2, 2022
A Simple Popup Shape For Flutter

popup_shapes ?? Popup Shapes for Notifications and tooltips. Shapes TOP LEFT CE

Mitul Vaghasiya 13 Oct 25, 2022
Simple to use yet powerfull style widgets with syntax inspired by CSS.

Division Simple to use yet powerfull style widgets with syntax inspired by CSS. Please check out styled_widget which is a replacement of Division! The

Rein Gundersen Bentdal 266 Nov 20, 2022
A simple widget for animating a set of images with full custom controls as an alternative to using a GIF file.

image_sequence_animator A simple widget for animating a set of images with full custom controls as an alternative to using a GIF file. If you have a G

AliYigitBireroglu 135 Jan 5, 2023
A simple custom loading indicator package.

custom_loading_indicator A Flutter package to customise the loading indicators with your organisation's logo. Let's say you're a dentist and your app

Harshad Manglani 3 Aug 10, 2020