BubbleShowcase is a small but power flutter package that allows you to highlight specific parts of your app to explain them to the user or to showcase your app new features.

Overview

BubbleShowcase

BubbleShowcase is a small but powerful flutter package that allows you to highlight specific parts of your app (to explain them to the user for instance) or to showcase your app new features.

Preview

Getting Started

This package is easy to use. Take a look at the following snippet (which is using speech_bubble) :

BubbleShowcase(
  bubbleShowcaseId: 'my_bubble_showcase',
  bubbleShowcaseVersion: 1,
  bubbleSlides: [
    RelativeBubbleSlide(
      widgetKey: widgetToHighlightKey,
      child: RelativeBubbleSlideChild(
        direction: AxisDirection.right,
        widget: SpeechBubble(
          nipLocation: NipLocation.LEFT,
          color: Colors.blue,
          child: Padding(
            padding: EdgeInsets.all(10),
            child: Text(
              'This is a new cool feature !',
              style: TextStyle(color: Colors.white),
            ),
          ),
        ),
      ),
    ),
  ],
  child: MyMainWidget(),
);

It creates a BubbleShowcase widget with only one BubbleSlide. This slide will highlight the widget that holds the key widgetToHighlightKey. The speech bubble will be placed on the right of the widget.

BubbleShowcase is not limited to highlight a specific widget. You can also highlight a specific part of your app by its coordinates :

BubbleShowcase(
  bubbleShowcaseId: 'my_bubble_showcase',
  bubbleShowcaseVersion: 1,
  bubbleSlides: [
    AbsoluteBubbleSlide(
      positionCalculator: (size) => Position(
        top: 0,
        right: 0,
        bottom: 0,
        left: 0,
      ),
      child: AbsoluteBubbleSlideChild(
        positionCalculator: (size) => Position(
          top: 0,
          left: 0,
        ),
        widget: SpeechBubble(
          nipLocation: NipLocation.LEFT,
          color: Colors.blue,
          child: Padding(
            padding: EdgeInsets.all(10),
            child: Text(
              'This is the top left corner of your app.',
              style: TextStyle(color: Colors.white),
            ),
          ),
        ),
      ),
    ),
  ],
  child: MyMainWidget(),
);

This will display the speech bubble on the top left corner of your app.

Options

The showcase

The showcase is where everything begins. Let's see the available options :

  • bubbleShowcaseId The showcase identifier. Must be unique across the app as it is used as a saving mean; for instance when the showcase should not be reopened (required).
  • bubbleShowcaseVersion The showcase version. Increase it when you update the showcase, this allows to redisplay the it to the user if doNotReopenOnClose is set to true (required).
  • doNotReopenOnClose Whether this showcase should be reopened once closed.
  • bubbleSlides The slides to display (required & must not be empty).
  • child The widget to display below the slides. It should be your app main widget.
  • counterText The current slide counter text. :i targets the current slide number and :n targets the maximum slide number.
  • showCloseButton Whether to show a little close button on the top left of the slide.

The slides

The slides is what is highlighting a specific part of your app. There are two main categories of positioning : Absolute and Relative. Here is a little summary :

Position Class name Use case Specific options
Absolute AbsoluteBubbleSlide You want to position your slide according to a x, y position on the screen and not a specific widget. positionCalculator The function that calculates the slide position on the screen.
Relative RelativeBubbleSlide You want to position your slide according to a specific widget. widgetKey The global key that the target widget is holding.

All slides have these options in common :

  • shape The slide shape (available are Rectangle, RoundedRectangle, Oval and Circle but you can add a custom one by extending the Shape class).
  • boxShadow The slide box shadow (containing the color, the blur radius, the spread radius, ...).
  • child The slide child, see below (required).

The slides children

Slides children are what are displayed according to what you are highlighting (it can be a speech bubble for example). The same positioning system is also available for children :

Position Class name Use case Specific options
Absolute AbsoluteBubbleSlideChild You want to position the child according to a x, y position on the screen and not the highlighted part of the screen. positionCalculator The function that calculates the child position on the screen.
Relative RelativeBubbleSlideChild You want to position the child according to the highlighted zone. direction Where to position the child compared to the highlighted zone.

All children have these options in common :

  • widget The widget to display (required).

But you have a lot of other options ! Don't hesitate to check the API Reference or the Github repo.

Contributions

You have a lot of options to contribute to this project ! You can :

Comments
  • Have the SpeechBubble display above the highlighted area

    Have the SpeechBubble display above the highlighted area

    Is your feature request related to a problem? Please describe. I need the Bubble to be displayed above the widget I want to highlight. Changing the direction property in the RelativeBubbleSlideChild should place it above right? :S But it does not. Otherwise, I simply used the code from the example.

    Describe the solution you'd like A way to put the SpeechBubble above the widget.

    Describe alternatives you've considered Using another plugin, but that one has other issues...

    Additional context Add any other context or screenshots about the feature request here.

    bug 
    opened by lunaticcoding 3
  • feat: Allow the passthrough of pointer events inside the highlighted area

    feat: Allow the passthrough of pointer events inside the highlighted area

    In my use case, I require the user to click some buttons inside the highlighted area, afterwards I wanted to continue the showcase, so what I did is:

    • Added PassthroughMode enum that declares the behavior of the passthrough, by default RelativeBubbleSlide uses the PassthroughMode.NONE option which absorbs all pointer events and advances the showcase, as it currently is doing.
    • When PassthroughMode.INSIDE_WITH_NOTIFICATION is used, several things happen:
      • A CustomClipper is used instead of a CustomPainter, which clips around the highlighted area, leaving the highlighted area exposed to pointer events
      • The default behavior of continuing the showcase when the user clicks anywhere is removed. To continue the showcase, the user MUST dispatch a BubbleShowcaseNotification Notification that lets the BubbleShowcase object know that it should continue.
        • This is thought so the user can easily do async tasks and then notifiy the BubbleShowcase when it should continue.
        • Pretty useful as well if you want to wrap the BubbleSlide with a GestureRecognizer to override the default behavior of the button or element you want the user to interact with.
    • Added the option of "padding" (Default of 0, like it currently is) to the highlighted area. The amount of padding is added to the Position that is gotten from the highlighted widget.
    • Updated the example with a 4th slide which includes highlightPadding and PassthroughMode.INSIDE_WITH_NOTIFICATION
    • Made a comment regarding the initialDelay property be a doc comment instead of being a normal comment.

    Default current behavior is retained while adding the new options and functionality.

    opened by Termtime 2
  • Allow async callback function in bubbleSlides Array

    Allow async callback function in bubbleSlides Array

    Is your feature request related to a problem? Please describe. Some of the widgets I need to be scrolled to first, before highlighting them.

    Describe the solution you'd like Inside the bubbleSlides array, allow for void and async returns. Something like

    bubbleSlides: [
          BubbleSlide(key1),
          () async {
                await Scrollable.ensureVisible(key2.currentContext);
          }(),
          BubbleSlide2(key2),
    ],
    

    Describe alternatives you've considered Other Packages allow for this feature but don't provide enough flexibility with regards to where to place the explanation text for the highlighted widget.

    Additional context Add any other context or screenshots about the feature request here.

    enhancement 
    opened by lunaticcoding 2
  • RangeError when setting doNotReopenOnClose to true

    RangeError when setting doNotReopenOnClose to true

    Describe the bug I set up a few bubbles and showcases, and when I (later on) set doNotReopenOnClose to true, I get the following error: RangeError (index): Invalid value: Not in range 0..1, inclusive: -1 This is at: _BubbleShowcaseState._createCurrentSlideEntry. (package:bubble_showcase/src/showcase.dart:129:50)

    To Reproduce

    1. Create some bubbles and showcases
    2. Enable doNotReopenOnClose

    Expected behavior No exception.

    Smartphone (please complete the following information): Nexus 5X API R Emulator on MacOS

    bug 
    opened by danielmarek 2
  • Add an enabled parameter and check if the widget is mounted

    Add an enabled parameter and check if the widget is mounted

    We need to check if the widget is still mounted after the delay.

    The enabled parameter is useful in some cases that we don't want to show the showcase by purpose.

    opened by rodineijf 1
  • Child widget to display above highlight

    Child widget to display above highlight

    Is your feature request related to a problem? Please describe. I'm unable to get the child of a RelativeBubbleSlideChild to sit above the highlighted area. Describe the solution you'd like I would like a way to get the child of a RelativeBubbleSlideChild to sit on top of the highlighted area. When I set the direction: AxisDirection.up it just writes the letters underneath each other.

    Describe alternatives you've considered I tried the AbsoluteBubbleSlideChild but it becomes messy to get the positions of the different widgets that I'm trying to highlight. The NipLocation doesn't seem to dictate there the child is positioned relative to the highlighted widget either

    Additional context Screen Shot 2020-08-27 at 6 35 47 pm

    enhancement 
    opened by DonC83 1
  • const BubbleShowcaseNotification()..dispatch(context) is not continuing flow

    const BubbleShowcaseNotification()..dispatch(context) is not continuing flow

    Describe the bug The function const BubbleShowcaseNotification()..dispatch(context); is not progressing the showcase

    To Reproduce Steps to reproduce the behavior:

    1. Set RelativeBubbleSlide with PassthroughMode.INSIDE_WITH_NOTIFICATION,
    2. Use const BubbleShowcaseNotification()..dispatch(context); to progress showcase

    Screenshots image

    Defining the showcase slide: image

    Within the build function: image

    Additional context Typical scenario is to progress the showcase using a custom button inside the showcase bubble like so: image

    ** UPDATE ** I was able to get this to work by fetching the context directly from the RelativeBubbleSlide widgetKey. In this case (from the example above) _first.currentContext. Therefore using const BubbleShowcaseNotification()..dispatch(_first.currentContext); works to progress showcase

    bug 
    opened by Wian-TMC 0
  •  Add a callback when a slide finished

    Add a callback when a slide finished

    Maybe i am missing something from the docs. But to me it seems like such a feature does not exist at the moment. I basically would like to have a callback when one BubbleSlide was clicked on. So that a certain action, like changing the route, can be executed.

    My Idea would be to add something like:

    AbsoluteBubbleSlide(
       ...
       onFinished: () {}
       child: 
       ...
    )
    
    enhancement 
    opened by CaptainDario 0
  • Add options to externalise showcase storage

    Add options to externalise showcase storage

    Adds two callback functions to Showcase widget:

    • isSlideVisible
    • hideSlide

    That allows to externalize slide visibility and control it from consumer application code.

    Both arguments have default values that stores data in SharedPreferences, to keep the same default behaviour of library.

    Main driver for this change is to improve end user experience when app is used on multiple devices. In such case, state of slides may be stored on the user profile and then ignored when app is started on a different device.

    opened by dluksza 0
  • How do you control the sequence of BubbleShowcase across components?

    How do you control the sequence of BubbleShowcase across components?

    Thank god for developing such a great plugin that helped me a lot. My business scenario requires cross component action BubbleShowcase. Could you please control the sequence of their presentation? The current situation is that they will be presented at the same time.

    enhancement 
    opened by Pluto1219 0
  • Error remove called on null

    Error remove called on null

    i got this error when navigating multiple times

    flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
    flutter: The following NoSuchMethodError was thrown while finalizing the widget tree:
    flutter: The method 'remove' was called on null.
    flutter: Receiver: null
    flutter: Tried calling: remove()
    flutter:
    flutter: When the exception was thrown, this was the stack:
    flutter: #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
    flutter: #1      _BubbleShowcaseState.dispose (package:bubble_showcase/src/showcase.dart:88:24)
    flutter: #2      StatefulElement.unmount (package:flutter/src/widgets/framework.dart:4435:12)
    flutter: #3      _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1748:13)
    flutter: #4      _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #5      ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #6      _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #7      _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #8      MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5534:16)
    flutter: #9      _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #10     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #11     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #12     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #13     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #14     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #15     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #16     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #17     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #18     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #19     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #20     MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5534:16)
    flutter: #21     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #22     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #23     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #24     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #25     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #26     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #27     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #28     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #29     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #30     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #31     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #32     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #33     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #34     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #35     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #36     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #37     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #38     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #39     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #40     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #41     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #42     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #43     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #44     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #45     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #46     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #47     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #48     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #49     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #50     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #51     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #52     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #53     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #54     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #55     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #56     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5433:14)
    flutter: #57     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #58     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #59     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #60     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    flutter: #61     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1746:7)
    flutter: #62     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4272:14)
    flutter: #63     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1744:13)
    
    bug 
    opened by rymesaint 0
  • Adding passthrough Mode for AbsoluteBubbleSlide

    Adding passthrough Mode for AbsoluteBubbleSlide

    Adding passthrough mode for the Absolute Bubble Slide will allow us to force the user to interact with a specific position and will not dismiss the showcase when pressing anywhere on the screen.

    enhancement 
    opened by Wian-TMC 0
  • Feat: better relative bubble positioning

    Feat: better relative bubble positioning

    Fixes Skyost/BubbleShowcase#16 This also supersedes part of the effort that #11 was doing, but I think a bit better, instead of declaring manually by how much you want the container to expand, we just let it automatically use the remainder of the parent's size in the direction that has the most space.

    For this I added a new system that allows the expansion of the slide's child beyond the highlighted area, it is heavily assisted by an Align widget (or in the case of the example the SpeechBubble's NipLocation which sets an alignment). And its not possible to center the slide in the highlighted area when you are totally inside one of the quadrants of the screen, the only place where we kinda expand while keeping it centered is when we are not inside only one quadrant (also known as being in the center quadrant of the screen). I added a bunch of private helper functions inside RelativeBubbleSlide

    To enable it you must set enableExtraSpace: true when declaring the RelativeBubbleSlide, this way it will be an opt-in change for previous users, and the previous system is still preserved and used by default.

    Also modified the example to add showcases of the new system and how it looks.

    LMK what you think @Skyost

    Also, something that would be a breaking change is that previously that when you set direction: AxisDirection.right it would actually put the bubbleSlide to the left and vice-versa, I have fixed this, so it could break someone's BubbleShowcase, I would suggest moving a major version for the next release.

    opened by Termtime 3
  • BubbleShowcase cannot exceed highlighted widget's dimensions

    BubbleShowcase cannot exceed highlighted widget's dimensions

    Describe the bug If you set a RelativeBubbleSlide to be on a horizontal axis (AxisDirection.right or AxisDirection.left) the BubbleShowcase widget will at maximum be of the height of the widget and cannot exceed it. If you set it to a vertical axis (AxisDirection.up or AxisDirection.down) the same happens but with the width of the RelativeBubbleSlide.

    To Reproduce Steps to reproduce the behavior:

    1. In a Scaffold, create a small widget, for example an IconButton
    2. Add a RelativeBubbleSlide that focuses on the key of the IconButton, the structure of the BubbleSlides follows the structure of the BubbleSlide _firstSlide in the example.dart file of this package.
    3. Set the RelativeBubbleSlide direction to be a horizontal axis.
    4. See how the container overflows from the text not being able to fit in the small height of the IconButton
    5. Set the RelativeBubbleSlide direction to be a vertical axis.
    6. See how the container overflows vertically from the text not being able to fit in the small width of the IconButton

    Expected behavior You should be able to go beyond the width/height of the widget you are highlighting.

    Screenshots image image

    Smartphone (please complete the following information):

    • Device: Pixel 2
    • OS: Android API 29
    • Flutter version: 2.2.3
    • bubble_showcase version: ^1.0.0
    bug 
    opened by Termtime 2
  • Method to start projection

    Method to start projection

    Is your feature request related to a problem? Please describe. Issue occurs when you have a few pages in PageView. You add BubbleShowcase to the third page. So if you open this widget with PageView you are actually on the first page.

    Go to the third page, BubbleShowcase started before the end of the animation (animations when you move from first to third page)

    So, it does not properly highlight widgets (it highlights widget out of the screen and so on)

    Describe the solution you'd like We should have a possibility to start animations manually. Like in showcaseview.

    WidgetsBinding.instance.addPostFrameCallback((_) =>
            ShowCaseWidget.startShowCase(context, [_one, _two, _three]));
    

    Describe alternatives you've considered The default behaviour of starting BubbleShowcase projections should wait until the UI build is completely finished.

    Additional context Add any other context or screenshots about the feature request here.

    enhancement 
    opened by dramcio 0
Owner
Hugo Delaunay
💻 Yet Another Developer
Hugo Delaunay
Automatically generate profile picture with random first name and background color. But you can still provide pictures if you have them. As the default color, based on the name of the first letter. :fire: :fire: :fire:

FLUTTER PROFILE PICTURE Automatically generate profile picture with random first name and background color. But you can still provide pictures if you

Aditya Dharmawan Saputra 10 Dec 20, 2022
Spartial - A flutter app that automatically skips the lesser parts of Spotify songs

Spartial (Spartial.app) Mobile app that lets you automatically skip parts of Spo

Ruud Brouwers 3 Mar 16, 2022
Practice code of simple flutter app to explain how provider works as across the widget state management.

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

Syed Uzair 9 Nov 7, 2022
Totally *legal* Instagram automation, crosses your user follower/following data to find who you follow, but doesnt follow you

untruth-instagram-followers Totally *legal* Instagram automation. Crosses a user follower/following data to find who he follows, but that doesn't foll

Olha o Robô 3 Oct 12, 2022
This project provides an amazing widget for using the specific inputfield for the specific platform

This project provides an amazing widget for using the specific inputfield for the specific platform

Kovács Levente 0 Apr 12, 2022
LakhanKumawat ᵖ⁺ 12 Dec 6, 2022
Todo app codelab - A simple UI for todo app to showcase Flutter features and core concepts

Codelab Todo App A simple todo app UI for to showcase Flutter and Dart core conc

Junior Medehou 3 May 12, 2022
SoundVolumeView that displays general information and the current volume level for all active sound components in your system, and allows you to instantly mute and unmute them

SoundVolumeView that displays general information and the current volume level for all active sound components in your system, and allows you to instantly mute and unmute them

Domingo 4 Mar 4, 2022
Agora - Highlight Active Speaker in a video call

Highlight Active Speaker in a video call When a meeting or video chat is complet

null 3 Nov 23, 2022
An app for small and medium organizations (SME) manager, with NFC-tag, e-tag and QR code features supported.

BK LAB Manager - an app for group management 1. Getting Started An app for small and medium organizations (SME) manager, with NFC-tag, e-tag and QR co

Andrew Ng 9 Dec 11, 2022
Create a Flutter User Profile Page UI where you can access and edit your user's information within your Flutter app.

Flutter Tutorial - User Profile Page UI 1/2 Create a Flutter User Profile Page UI where you can access and edit your user's information within your Fl

Johannes Milke 46 Dec 6, 2022
Create a Flutter User Profile Page UI where you can access and edit your user's information within your Flutter app.

Flutter Tutorial - User Profile Page UI #2 Create a Flutter User Profile Page UI where you can access and edit your user's information within your Flu

Johannes Milke 45 Dec 15, 2022
A flutter application that allows users to test their knowledge through quizzes made for specific topics.

Quiz_App A flutter application that allows users to test their knowledge through quizzes made for specific topics. Setup The application consists of a

null 0 Dec 29, 2021
Api Call Check flutter - A new Flutter project that demonstrates api calling and displays them in a scrollable list

api_fetch A new Flutter project that demonstrates api calling and displays them

Babish Shrestha 0 Jan 2, 2022
Flutter plugin for selecting images from the Android and iOS image library, taking new pictures with the camera, and edit them before using such as rotation, cropping, adding sticker/text/filters.

advance_image_picker Flutter plugin for selecting multiple images from the Android and iOS image library, taking new pictures with the camera, and edi

Weta Vietnam 91 Dec 19, 2022
Music-App-Flutter - This is a flutter app which has some songs displayed in the form of a list and user can play any of them by clicking on the name of the song.

music_player_app A music player app made by me in flutter About the App This is a music player which i made to play audio files which we have passed i

Harsh Kumar Khatri 3 Apr 1, 2021
Generates a new Flutter app with http client, theme, routing and localization features.

Starter Template Generates a new Flutter app with http client, theme, routing and localization features. Brick Uses: dio as http client pretty_dio_log

Cem Avcı 12 Nov 3, 2022