A Flutter implementation of slidable list item with directional slide actions.

Overview

flutter_slidable

A Flutter implementation of slidable list item with directional slide actions that can be dismissed.

Pub Donate

Flutter Favorite Slidable is now a Flutter Favorite package!

Overview

Features

  • Accepts primary (left/top) and secondary (right/bottom) widget lists as slide actions.
  • Can be dismissed.
  • 4 built-in action panes.
  • 2 built-in slide action widgets.
  • 1 built-in dismiss animation.
  • You can easily create custom layouts and animations.
  • You can use a builder to create your slide actions if you want special effects during animation.
  • Closes when a slide action has been tapped (overridable).
  • Closes when the nearest Scrollable starts to scroll (overridable).
  • Option to disable the slide effect easily.

Getting started

In the pubspec.yaml of your flutter project, add the following dependency:

dependencies:
  ...
  flutter_slidable:

In your library add the following import:

import 'package:flutter_slidable/flutter_slidable.dart';

For help getting started with Flutter, view the online documentation.

Constructors

You can create a Slidable in two different ways:

  • By calling the Slidable constructor and passing a list of slide actions.
  • By calling the Slidable.builder constructor and passing slide action builders, if you want special effects during the animation.

A Slidable needs multiple things:

  • Slide actions (see below for details). They can be any widget. For convenience, this package has 2 built-in side action widgets.
  • A slide action pane widget. This is what controls the layout and the animation of the slide menu.
  • An extent ratio between a slide action extent and the item extent.
  • A child.

The actions contains the slide actions that appear when the child has been dragged down or to the right. The secondaryActions contains the slide actions that appear when the child has been dragged up or to the left.

A direction parameter lets you choose if you want actions to appear when you slide horizontally (default) or vertically.

Slidable(
  actionPane: SlidableDrawerActionPane(),
  actionExtentRatio: 0.25,
  child: Container(
    color: Colors.white,
    child: ListTile(
      leading: CircleAvatar(
        backgroundColor: Colors.indigoAccent,
        child: Text('$3'),
        foregroundColor: Colors.white,
      ),
      title: Text('Tile n°$3'),
      subtitle: Text('SlidableDrawerDelegate'),
    ),
  ),
  actions: <Widget>[
    IconSlideAction(
      caption: 'Archive',
      color: Colors.blue,
      icon: Icons.archive,
      onTap: () => _showSnackBar('Archive'),
    ),
    IconSlideAction(
      caption: 'Share',
      color: Colors.indigo,
      icon: Icons.share,
      onTap: () => _showSnackBar('Share'),
    ),
  ],
  secondaryActions: <Widget>[
    IconSlideAction(
      caption: 'More',
      color: Colors.black45,
      icon: Icons.more_horiz,
      onTap: () => _showSnackBar('More'),
    ),
    IconSlideAction(
      caption: 'Delete',
      color: Colors.red,
      icon: Icons.delete,
      onTap: () => _showSnackBar('Delete'),
    ),
  ],
);

Built-in slide actions

This package comes with 2 kinds of slide actions:

  • SlideAction, which is the most flexible. You can choose a background color, or any decoration, and it takes any widget as a child.
  • IconSlideAction, which requires an icon. It can have a background color and a caption below the icon.

Built-in action panes

This package comes with 4 kinds of action panes:

SlidableBehindActionPane

The slide actions stay behind the item while it's sliding:

Overview

SlidableScrollActionPane

The slide actions follow the item while it's sliding:

Overview

SlidableDrawerActionPane

The slide actions animate like drawers while the item is sliding:

Overview

SlidableStrechActionPane

The slide actions stretch while the item is sliding:

Overview

FAQ

How to prevent my slide action to close after it has been tapped?

By default, SlideAction and IconSlideAction close on tap. To prevent this, you can pass in false to the closeOnTap constructor parameter.

How to prevent my Slidable to close after my list has scrolled?

By default, a Slidable closes when the nearest Scrollable widget starts to scroll. To prevent this, you can pass in false to the closeOnScroll constructor parameter.

How can I dismiss my Slidable?

In order to make your Slidable dismissible, you have to set the dismissal parameter of the Slidable constructor and provide a child. You can set any widget as a child of SlidableDismissal. For the moment there is only one built-in: SlidableDrawerDismissal.

The actionType passed to the onDismissed callback let you know which action has been dismissed.

When a Slidable is dismissible, the key parameter must not be null.

Example:

dismissal: SlidableDismissal(
  child: SlidableDrawerDismissal(),
  onDismissed: (actionType) {
    _showSnackBar(
        context,
        actionType == SlideActionType.primary
            ? 'Dismiss Archive'
            : 'Dimiss Delete');
    setState(() {
      items.removeAt(index);
    });
  },
),

How can I prevent to dismiss one side but not the other?

If you only want one side to be dismissible, you can set the associated threshold to 1.0 or more. For example, if you don't want the first primary action to be dismissed, you will set the following thresholds on the dismissal:

dismissThresholds: <SlideActionType, double>{
  SlideActionType.primary: 1.0
},

How to let the user cancel a dismissal?

You can let the user confirm the dismissal by setting the onWillDismiss callback on the dismissal.

Example:

dismissal: SlidableDismissal(
  child: SlidableDrawerDismissal(),
  onWillDismiss: (actionType) {
          return showDialog<bool>(
            context: context,
            builder: (context) {
              return AlertDialog(
                title: Text('Delete'),
                content: Text('Item will be deleted'),
                actions: <Widget>[
                  FlatButton(
                    child: Text('Cancel'),
                    onPressed: () => Navigator.of(context).pop(false),
                  ),
                  FlatButton(
                    child: Text('Ok'),
                    onPressed: () => Navigator.of(context).pop(true),
                  ),
                ],
              );
            },
          );
        },
        ...
        ),

How to let keep only one Slidable open?

You have to set the controller parameter of the Slidable constructors to a SlidableController instance:

final SlidableController slidableController = SlidableController();
...
Slidable(
      key: Key(item.title),
      controller: slidableController,
      ...
      );

How can I animate an external widget at the same time as the active Slidable?

You have to set the callbacks of a SlidableController instance: The onSlideAnimationChanged let you get the animation of the current Slidable. The onSlideIsOpenChanged let you know when the current Slidable opens and closes.

final SlidableController slidableController = SlidableController(
  onSlideAnimationChanged: handleSlideAnimationChanged,
  onSlideIsOpenChanged: handleSlideIsOpenChanged,
  );
...
  void handleSlideAnimationChanged(Animation<double> slideAnimation) {
    setState(() {
      _rotationAnimation = slideAnimation;
    });
  }

  void handleSlideIsOpenChanged(bool isOpen) {
    setState(() {
      _fabColor = isOpen ? Colors.green : Colors.blue;
    });
  }

How can I open the Slidable programmatically?

You can open or close the Slidable programmatically by calling the open or close method of the SlidableState. The easiest way get the SlidableState from a child is to call Slidable.of(context).

The open method has an optional parameter called actionType that let you choose which action pane to open.

How can I dismiss the Slidable programmatically?

Similar to opening or closing, you can dismiss the Slidable programmatically by calling the dismiss method of the SlidableState.

If you want to use the dismiss method without allowing your user to slide to dismiss, you can set the dragDismissible parameter of the SlidableDismissal constructor to false.

Sponsoring

I'm working on my packages on my free-time, but I don't have as much time as I would. If this package or any other package I created is helping you, please consider to sponsor me. By doing so, I will prioritize your issues or your pull-requests before the others.

Changelog

Please see the Changelog page to know what's recently changed.

Contributions

Feel free to contribute to this project.

If you find a bug or want a feature, but don't know how to fix/implement it, please fill an issue.
If you fixed a bug or implemented a feature, please send a pull request.

Comments
  • How to close slider from onWillDismiss?

    How to close slider from onWillDismiss?

    I'm using the onWillDismiss to allow the users some choices and want to close the slider when this event is triggered however nothing seems to work. I've used a controller, tried to get the SlideState using Slidable.of and neither of those options work.

    opened by warriorCoder 24
  • Add a SlidableController

    Add a SlidableController

    A SlidableController could open/close any Slidable. This can be useful if we want to close Slidables while scrolling, or if we want to close all the other Slidables while opening one.

    enhancement 
    opened by letsar 21
  • On tap trigger dismiss animation?

    On tap trigger dismiss animation?

    Great widget library!

    Is it possible to trigger the dismiss animation of the Slidable when a user taps a SlideAction?

    Something like:

                  onTap: () {
                     this.dismiss() // trigger animation of slidable leaving
                  },
    
    opened by abacaj 16
  • Sometime i get null exception

    Sometime i get null exception

    Hi,

    sometimes i see this error in errors log but not sure how to catch it:

    _CastError: Null check operator used on a null value
      File "framework.dart", line 916, in State.context
      File "slidable.dart", line 882, in SlidableState._startResizeAnimation.<fn>
      File "framework.dart", line 1088, in State.setState
      File "slidable.dart", line 880, in SlidableState._startResizeAnimation
      File "slidable.dart", line 844, in SlidableState._handleDismissStatusChanged
    
    waiting for user response 
    opened by vytautas-pranskunas- 15
  • Set SlidableController.activeState.open() with onTap

    Set SlidableController.activeState.open() with onTap

    Thank you for an awesome Flutter implementation! Is it possible to open the drawer and show all the iconslider actions through a onTap event on the Slidable? See the scenario on the two images below: screenshot

    Currently the only example that is given is to close the drawer as seen in Issue 33: https://github.com/letsar/flutter_slidable/issues/33 However, if the Slidable is not in an activestate, the output of: slidableController.activeState is null, and hence I am not able to do: slidableController.activeState.open() because it will simply say: "The method 'open' was called on null"

    See the example code below: codeexample

    enhancement 
    opened by DARdk 15
  • ClipBehavior cannot be none

    ClipBehavior cannot be none

    Goodmorning,

    I love your library and you're doing a great job with it! Just to let you know: I've noticed that in your custom SizeTransition class at line 147 there is the following operation to not clip when the sizeFactor is 1:

    https://github.com/letsar/flutter_slidable/blob/b4e78dedf43669f10f5c4564ccef8d4c5f29713d/lib/src/dismissal.dart#L147

    Setting the clipBehavior to none will cause the application to crash because the assert at line 680 of the flutter (package:flutter/src/widgets/basic.dart:680:12) will fail. It is also stated in the ClipRect -> clipBehavior property documentation that the clipBehavior cannot be set to none or null.

    I think that the solution is to leave the clipBehavior property to "hardEdge" or find another solution.

    Glad to help and sorry if I did not meed the GitHub guidelines. Thanks for the attention to this issue and keep doing a great job with this library!

    opened by iJack93 14
  • Smooth closing when dismissing or pressing a button

    Smooth closing when dismissing or pressing a button

    Hello,

    is there a way to have the drawer close when we press a button?

    Same question when we use the dismiss swipe action with a false return (in order to prevent the item from being dismissed).

    The drawer does not close like you would expect, it just snaps back to it's original closed state.

    Maybe i am not implementing it properly but i thought i would ask.

    thanks.

    opened by nicolasvahidzein 13
  • Slidable1.1.0,How to close only one of list?

    Slidable1.1.0,How to close only one of list? "Slidable.of(context)" return "null"

    void closeSlidable(context) { if (slidablecontroller == null) { slidablecontroller = Slidable.of(context); // slidablecontroller = SlidableController(this); } if (slidablecontroller != null) { SlidableGroupNotification.dispatch( context, SlidableAutoCloseNotification( groupTag: 'loveSellerList', controller: slidablecontroller!, ), ); } else { print("null"); } }

    I want to close only one,but "Slidable.of(context)" return "null"

    @letsar I want to close it when I go the next page.

    opened by yingzi1208 12
  • UI error when navigating back

    UI error when navigating back

    When the slidable widget is shown and I press back I see the hidden element during the navigation:

    return ListView.separated(
                  separatorBuilder: (context, index) => Divider(height: 0),
                  itemCount: snapshot.data.docs.length,
                  itemBuilder: (BuildContext context, int index) {
                    final contact = snapshot.data.docs[index].data();
                    contact["documentID"] =
                        snapshot.data.docs[0].data()["documentID"];
                    return _contact(contact);
                  },
                );
    
    Widget _contact(contact) {
        return Slidable(
          actionPane: SlidableDrawerActionPane(),
          actionExtentRatio: 0.25,
          child: Container(
            child: ListTile(
              title: Text(contact["name"]),
              subtitle: contact["info"] != "" ? Text(contact["info"]) : null,
            ),
          ),
          actions: <Widget>[
            IconSlideAction(
              // caption: 'Edit',
              color: Theme.of(context).primaryColor,
              icon: LineIcons.pen,
              onTap: () async => await Navigator.of(context)
                  .pushNamed(
                "/create-contact",
                arguments: CreateContactData(false, contact),
              )
                  .then((val) {
                print(val);
              }),
            ),
          ],
          secondaryActions: <Widget>[
            Visibility(
              child: IconSlideAction(
                // caption: 'Website',
                color: Theme.of(context).primaryColor,
                icon: LineIcons.globe,
                onTap: () => PhoneContact().web(context, contact["web"]),
              ),
              visible: contact["web"].length > 11,
            ),
            IconSlideAction(
              // caption: 'Email',
              color: Theme.of(context).primaryColor,
              icon: LineIcons.envelope,
              onTap: () => PhoneContact().web(context, contact["email"]),
            ),
            IconSlideAction(
              // caption: 'Whatsapp',
              color: Theme.of(context).primaryColor,
              icon: LineIcons.comments,
              onTap: () => PhoneContact().whatsapp(context,
                  contact["phone"]["phoneCode"] + contact["phone"]["phoneNumber"]),
            ),IconSlideAction(
              // caption: 'Whatsapp',
              color: Theme.of(context).primaryColor,
              icon: LineIcons.phone,
              onTap: () => PhoneContact().call(context,contact["phone"]["phoneCode"] +contact["phone"]["phoneNumber"]);
            ),
          ],
        );
    }
    
    opened by erperejildo 12
  • Can't dismiss Slidable on endActionPane (flutter_slidable 1.0.0-dev.2)

    Can't dismiss Slidable on endActionPane (flutter_slidable 1.0.0-dev.2)

    Slidable not animate to full width and not dismiss at endActionPane. On startActionPane same code works properly.

    Slidable(
      child: ListTile(title: Text('Slide me')),
      key: ValueKey(0),
      endActionPane: ActionPane(
        motion: const ScrollMotion(),
        dismissible: DismissiblePane(
          onDismissed: () {},
        ),
        children: [
          SlidableAction(
            onPressed: () {},
            backgroundColor: Color(0xFFFE4A49),
            foregroundColor: Colors.white,
            label: 'Delete',
          ),
        ],
      ),
    ),
    
    

    Flutter 2.2.1 • channel stable • https://github.com/flutter/flutter Framework • revision 02c026b03c (12 days ago) • 2021-05-27 12:24:44 -0700 Engine • revision 0fdb562ac8 Tools • Dart 2.13.1

    opened by vahellame 12
  • Can't make corners of the Slidable's child rounded (version 1.2.0)

    Can't make corners of the Slidable's child rounded (version 1.2.0)

    Hello!

    I'm trying to make the corners of the Slidable's child rounded. But all I can do for now is to make rounded corners for the ActionPane or every single action. But the child has angles, when I'm sliding it.

    Here it is:

    7944F08C-B4A8-4D67-8713-0BA57C148791_4_5005_c

    How to avoid this and make corners rounded?

    Here is my code:

    ClipRRect(
            borderRadius: BorderRadius.circular(6.r),
            child: SlidableAutoCloseBehavior(
              child: Slidable(
                key: ValueKey<int>(index),
                enabled: controller.selectedItems.isEmpty,
                groupTag: 0,
                startActionPane: ActionPane(
                  motion: const BehindMotion(),
                  children: <Widget>[
                    CustomSlidableAction(
                      backgroundColor: _theme.colorScheme.secondaryVariant,
                      onPressed: (final BuildContext context) {},
                      child: AppIcons.settingsStarIcon(
                        color: _theme.colorScheme.primary,
                      ),
                    ),
                    CustomSlidableAction(
                      backgroundColor: _theme.colorScheme.secondaryVariant,
                      onPressed: (final BuildContext context) {},
                      child: AppIcons.pin(
                        color: _theme.colorScheme.primary,
                      ),
                    ),
                  ],
                ),
                endActionPane: ActionPane(
                  extentRatio: 0.25,
                  motion: const BehindMotion(),
                  // dismissible: DismissiblePane(
                  //   onDismissed: () {},
                  // ),
                  children: <Widget>[
                    CustomSlidableAction(
                      backgroundColor: _theme.iconTheme.color!,
                      onPressed: (final BuildContext context) {},
                      child: AppIcons.removePhoto(
                        color: _theme.colorScheme.primary,
                      ),
                    ),
                  ],
                ),
                child: Container(width: 347.w,
            height: 77.h,
            padding: EdgeInsets.fromLTRB(13.w, 10.h, 9.w, 10.h),
            decoration: BoxDecoration(
              color: isSelected
                  ? _theme.colorScheme.chatListSelectionColor
                  : _theme.colorScheme.surface,
              borderRadius: BorderRadius.circular(6.r),
            ),
    

    Is there any solution?

    Update (19.02.2022): To make it more clear. I need to achieve smth like this:

    Screenshot_20220219-120108.png

    opened by abigotado 11
  • when deleting flutter_slidable ListTile, next tile is outdented

    when deleting flutter_slidable ListTile, next tile is outdented

    I have a list of tiles. When I drag a tile to the left and tap delete, it will be deleted. However, the tile following the deleted becomes outdented (moved left). The deleted and the the edit button are not visible. When I further drag the outdented tile to the left, the buttons become visible as if the tile would not have been outdented. In other words, I have the right hand border of the tile 1cm away from the right screen border and if I drag it left, the buttons become slowly visible in the area between right tile border and right screen border.

    I am using flutter_slidable: ^2.0.0

    The code can be found here: https://stackoverflow.com/questions/74769232/when-deleting-flutter-slidable-listtile-next-tile-is-outdented

    opened by w461 3
  • A typo comment in `src/actions.dart`

    A typo comment in `src/actions.dart`

    Link: src/actions.dart Line: 175 Fix: Comment in line 175 should be /// BorderRadius of the OutlinedButton rather than /// Padding of the OutlinedButton. Please consider fixing it.

    opened by 321paranoiawhy 0
Releases(v1.0.0)
  • v1.0.0(Nov 12, 2021)

  • v0.5.4(Oct 6, 2019)

    0.5.4

    Added

    • Ripple effect when tapping on the IconSlideAction (https://github.com/letsar/flutter_slidable/pull/89)
    • Option to make the widget non-dismissible by dragging (https://github.com/letsar/flutter_slidable/pull/101)
    Source code(tar.gz)
    Source code(zip)
  • v0.4.9(Oct 15, 2018)

  • v0.4.8(Oct 9, 2018)

  • v0.4.7(Sep 17, 2018)

  • v0.4.6(Sep 8, 2018)

  • v0.4.5(Sep 5, 2018)

  • v0.4.4(Aug 31, 2018)

  • v0.4.3(Aug 22, 2018)

  • v0.4.2(Aug 22, 2018)

    0.4.2

    Fixed

    • https://github.com/letsar/flutter_slidable/issues/22 and https://github.com/letsar/flutter_slidable/issues/24 (Issue with controller).
    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Aug 8, 2018)

  • v0.4.0(Aug 2, 2018)

    Dismiss feature

    Added

    • The SlidableRenderingMode enum.
    • The SlideActionType enum.
    • The SlideToDismissDelegate classes.

    Modified

    • Added a renderingMode parameter in the SlideActionBuilder signature .
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Jul 23, 2018)

    Added

    • The closeOnTap argument on slide actions to close when a action has been tapped.
    • The closeOnScroll argument on Slidable to close when the nearest Scrollable starts to scroll.
    • The static Slidable.of function.

    Changed

    • The dragExtent field in SlidableDelegateContext has been changed to dragSign.
    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jul 22, 2018)

    Added

    • Slidable.builder constructor.
    • Vertical sliding.

    Changed

    • The slide actions are now hosted in a SlideActionDelegate instead of List<Widget> inside the Slidable widget.
    • The leftActions have been renamed to actions.
    • The rightActions have been renamed to secondaryActions.
    Source code(tar.gz)
    Source code(zip)
Owner
Romain Rastel
Flutter Developer
Romain Rastel
The projects and the materials that accompany the Flutter Apprentice book

The projects and the materials that accompany the Flutter Apprentice book

raywenderlich 2.3k Jan 7, 2023
A Flutter implementation of slidable list item with directional slide actions.

flutter_slidable A Flutter implementation of slidable list item with directional slide actions that can be dismissed. Slidable is now a Flutter Favori

Romain Rastel 2.3k Dec 28, 2022
Shortcuts and actions - Spice up your Flutter Desktop/Web apps with Shortcuts and Actions

Spice up your Flutter Desktop/Web apps with Shortcuts and Actions A desktop/web

Waleed Arshad 12 Nov 20, 2022
Slide puzzle - A slide puzzle built for Flutter Challenge

Slide Puzzle A slide puzzle built for Flutter Challenge. Built by Very Good Vent

Very Good Ventures 494 Dec 30, 2022
A simple slide-to-unlock widget for Flutter inspired by the Android Slide To Act.

Flutter Slide To Act A simple slide-to-unlock widget for Flutter inspired by the Android Slide To Act. Getting started Add slide_to_act to your pubspe

Salvatore Giordano 79 Dec 25, 2022
Animated Selection Slide Sezgin BilgetayAnimated Selection Slide An animated selection widget by swiping by Sezgin Bilgetay.

Animated Selection Slide This flutter project allows you to make your choices with animation in inbox. For UI, it's inspired by the great example on d

null 340 Jan 7, 2023
Item selling mobile app with secure payments with Payhere payment gateway. Auto APK generation with github actions CI/CD.

payhere_demo A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Shihara Dilshan 2 Jan 20, 2022
Multi directional infinite list with Sticky headers for Flutter applications

Sticky Infinite List Infinite list with sticky headers. This package was made in order to make possible render infinite list in both directions with s

Denis Beketsky 291 Dec 20, 2022
Multi directional infinite list with Sticky headers for Flutter applications

Sticky Infinite List Infinite list with sticky headers. This package was made in order to make possible render infinite list in both directions with s

Denis Beketsky 291 Dec 20, 2022
Responsive Scaffold - On mobile it shows a list and pushes to details and on tablet it shows the List and the selected item. Maintainer: @rodydavis

responsive_scaffold View the online demo here! On mobile it shows a list and pushes to details and on tablet it shows the List and the selected item.

Flutter Community 346 Dec 2, 2022
A Flutter slidable widget that provides an easy to use configuration. Highly customisable. Just as you want it!

A Flutter slidable widget that provides an easy to use configuration. Highly customisable. Just as you want it!

Ravi Kavaiya 89 Dec 8, 2022
Flutter package to create list of radio button, by providing a list of objects it can be a String list or list of Map.

Custom Radio Group List Flutter package to create list of radio button, by providing a list of objects it can be a String list or list of Map. Feature

Ashok Kumar Verma 0 Nov 30, 2021
A directional tooltip for flutter projects

just_the_tooltip just_the_tooltip gives you more flexibility over the Flutter standard Tooltip by allowing you to set arbitrary content. It also expan

Nollie 44 Jan 2, 2023
Flutter package designed to select an item from a list, with the option to filter and even search the items online.

select_dialog Package Package designed to select an item from a list, with the option to filter and even search the items online. Versions Non Null Sa

David Araujo 63 Dec 10, 2022
A flutter list view which can drag & move item to change order.

draggable_flutter_list A flutter list view which can drag & move item to change order. some codes come from flutter_list_drag_and_drop fix flutter_lis

刘彦博 40 Sep 22, 2022
A Horizontal List view With Lots of modification including a scaled current item.

Pub.dev Scaled List A Horizontal List view With Lots of modification including a scaled current item. Provided with curved custom painting and Dots in

Hosain Mohamed 35 Nov 5, 2022
:bug: Flutter debug helper widget with common and custom actions

Debug Friend Flutter debug helper widget with common and custom actions This helps you reduce the development and testing time of new features Show so

Stanislav Ilin 43 Dec 7, 2022
Flutter debug helper widget with common and custom actions

Flutter debug helper widget with common and custom actions

Stanislav Ilin 43 Dec 7, 2022
A customizable timer builder, with controller, animation, intervals, callbacks and custom actions for Flutter.

Custom Timer ⌛ A highly customizable timer builder, with controller, animation, intervals, callbacks, custom actions, and more! ?? Simple Usage @overr

Federico De Sía 27 Nov 23, 2022
First Flutter Project using StateFull,Important Widgets,proberties,actions

first_project A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Ahmed Hossny 1 Jan 8, 2022