Popover for Flutter. A popover is a transient view that appears above other content onscreen when you tap a control or in an area.

Overview

Popover

Popover screenshots

Popover for Flutter

Supported platforms Popover is released under the MIT license. Effective Dart PRs welcome!
Current Build Status.

Content

Features

A popover is a transient view that appears above other content onscreen when you tap a control or in an area. Typically, a popover includes an arrow pointing to the location from which it emerged. Popovers can be nonmodal or modal. A nonmodal popover is dismissed by tapping another part of the screen or a button on the popover. A modal popover is dismissed by tapping a Cancel or other button on the popover.

Source: Human Interface Guidelines.

Requirements

  • Dart: 2.12.0+
  • Flutter : 2.0.0+

Install

dependencies:
  popover: ^0.2.6+3

Example

See example/lib/main.dart.

import 'package:flutter/material.dart';
import 'package:popover/popover.dart';

class PopoverExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Popover Example')),
        body: const SafeArea(
          child: Padding(
            padding: EdgeInsets.all(16),
            child: Button(),
          ),
        ),
      ),
    );
  }
}

class Button extends StatelessWidget {
  const Button({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 80,
      height: 40,
      decoration: const BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.all(Radius.circular(5)),
        boxShadow: [BoxShadow(color: Colors.black26, blurRadius: 5)],
      ),
      child: GestureDetector(
        child: const Center(child: Text('Click Me')),
        onTap: () {
          showPopover(
            context: context,
            transitionDuration: const Duration(milliseconds: 150),
            bodyBuilder: (context) => const ListItems(),
            onPop: () => print('Popover was popped!'),
            direction: PopoverDirection.top,
            width: 200,
            height: 400,
            arrowHeight: 15,
            arrowWidth: 30,
          );
        },
      ),
    );
  }
}

class ListItems extends StatelessWidget {
  const ListItems({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scrollbar(
      child: Padding(
        padding: const EdgeInsets.symmetric(vertical: 8),
        child: ListView(
          padding: const EdgeInsets.all(8),
          children: [
            InkWell(
              onTap: () {
                Navigator.of(context)
                  ..pop()
                  ..push(
                    MaterialPageRoute<SecondRoute>(
                      builder: (context) => SecondRoute(),
                    ),
                  );
              },
              child: Container(
                height: 50,
                color: Colors.amber[100],
                child: const Center(child: Text('Entry A')),
              ),
            ),
            const Divider(),
            Container(
              height: 50,
              color: Colors.amber[200],
              child: const Center(child: Text('Entry B')),
            ),
            const Divider(),
            Container(
              height: 50,
              color: Colors.amber[300],
              child: const Center(child: Text('Entry C')),
            ),
          ],
        ),
      ),
    );
  }
}

class SecondRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Second Route'),
        automaticallyImplyLeading: false,
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () => Navigator.pop(context),
          child: const Text('Go back!'),
        ),
      ),
    );
  }
}

To see examples of the following package on a device or simulator:

cd example && flutter run

Support

Post issues and feature requests on the GitHub issue tracker.

License

The source code of Popover project is available under the MIT license. See the LICENSE file for more info.

Comments
  • Popover not visible on screen if called inside of SliverAppBar action

    Popover not visible on screen if called inside of SliverAppBar action

    Describe the bug I'm calling the showPopover function from an action of the SliverAppBar but the Popover is not shown on the screen. I guess that it is positioned outside of the screen.

    Code:

    class ManageDocuments extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final sessionState = context.watch<Verified>();
        return CustomScrollView(
          physics: const BouncingScrollPhysics(),
          slivers: <Widget>[
            SliverAppBar(
              // if floating is true the appbar becomes instantly visible if scrolled towards top
              // if it's false the appbar is only visible if completly scrolled back to top
              floating: true,
              expandedHeight: 60.0,
              backgroundColor: Theme.of(context).scaffoldBackgroundColor,
              title: Text(
                "Manage Documents",
                style: TextStyle(color: Theme.of(context).colorScheme.onBackground),
              ),
              centerTitle: true,
              actions: [
                IconButton(
                  icon: Icon(
                    Icons.add,
                    color: Theme.of(context).colorScheme.onBackground,
                  ),
                  onPressed: () => showPopover(
                    context: context,
                    bodyBuilder: (context) => Column(
                      children: [
                        Text(L.of(context).patientQuestionnaire),
                        Text(L.of(context).patientQuestionnaire),
                        Text(L.of(context).patientQuestionnaire),
                      ],
                    ),
                    direction: PopoverDirection.bottom,
                  ),
                ),
              ],
            ),
          ],
        );
      }
    }
    
    

    Expected behavior I expected the Popover to be positioned below the IconButton in the appBar, with the direction of PopoverDirection.bottom

    Screenshots I already clicked on the action IconButton and the background get's dimmed but the popover is out of screen. Unbenannt

    Smartphone (please complete the following information):

    • Device: Pixel C API 30
    • OS: Android 11.0
    bug enhancement 
    opened by JonasHiltl 35
  • Fix/popover render

    Fix/popover render

    Made some changes to fix issue #53 based on Flutter tutorial of synchronously BuildContexts, and some adjustments to null safety and animations.

    Pre-launch Checklist

    • [x] I read and followed the Effective Dart.
    • [x] I listed at least one issue or feature that this PR fixes or adds in the description above.
    • [ ] I updated/added relevant documentation (doc comments with ///).
    • [ ] I updated/added relevant documentation to README.md.
    • [ ] I updated/added relevant code samples to example.
    • [ ] I added new tests to check the change I am making or feature I am adding, or Minikin said the PR is test-exempt.
    • [x] All existing and new tests are passing.
    opened by VictorOhashi 5
  • Error when parent is removed even with isParentAlive: () => mounted

    Error when parent is removed even with isParentAlive: () => mounted

    Describe the bug the "red screen of death" appears when parent widget is removed and popover is shown.

    To Reproduce Steps to reproduce the behavior:

    1. a ListView.builder generates a variable number of stateful widgets based on a list (provided by a BlocBuilder). Each of these widgets contains an InkWell with showPopover associated to the onTap parameter. in the body of the popover a BlocListener is present to ensure that, if the list changes and the parent widget is removed, the popover uses navigator.pop to pop itself immediately;
    2. the user taps on one of the InkWell and the popover appears;
    3. the list updates, the parent widget should be removed;
    4. ListView.builder rebuilds, removing the appropriate element;
    5. popover throws the following error just before popping itself, even if isParentAlive is set to () => mounted. The same error happens when, without using navigator.pop inside the BlocListener, is the user that taps outside the popover area after parent is removed;

    `======== Exception caught by widgets library ======================================================= The following assertion was thrown building LayoutBuilder: Cannot get renderObject of inactive element.

    In order for an element to have a valid renderObject, it must be active, which means it is part of the tree. Instead, this element is in the _ElementLifecycle.inactive state. If you called this method from a State object, consider guarding it with State.mounted. The findRenderObject() method was called for the following element: PlayerStory dependencies: [_InheritedTheme, _LocalizationsScope-[GlobalKey#e783b]] state: _PlayerStoryState#a1542 The relevant error-causing widget was: MaterialApp MaterialApp:file:///Users/gianlucagalli/AndroidStudioProjects/hero_realms_life_counter/lib/main.dart:104:18 When the exception was thrown, this was the stack: #0 Element.findRenderObject. (package:flutter/src/widgets/framework.dart:4039:9) #1 Element.findRenderObject (package:flutter/src/widgets/framework.dart:4052:6) #2 _PopoverItemState._configure (package:popover/src/popover_item.dart:100:32) #3 _PopoverItemState.build. (package:popover/src/popover_item.dart:57:9) #4 _LayoutBuilderElement._layout.layoutCallback (package:flutter/src/widgets/layout_builder.dart:119:77) #5 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2597:19) #6 _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:153:12) #7 RenderObject.invokeLayoutCallback. (package:flutter/src/rendering/object.dart:2025:59) #8 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15) #9 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:2025:14) #10 RenderConstrainedLayoutBuilder.rebuildIfNecessary (package:flutter/src/widgets/layout_builder.dart:227:7) #11 _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:316:5) #12 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1757:7) #13 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18) #14 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:504:19) #15 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:892:13) #16 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5) #17 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15) #18 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9) #19 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5) #23 _invoke (dart:ui/hooks.dart:151:10) #24 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5) #25 _drawFrame (dart:ui/hooks.dart:115:31) (elided 3 frames from dart:async) ====================================================================================================` Expected behavior popover not throwing exceptions

    Smartphone (please complete the following information):

    • Device: OnePlus 5T
    • OS: Android 10

    Additional context here is the code:

    //...
    ListView.builder(
                    physics: const BouncingScrollPhysics(),
                    scrollDirection: Axis.horizontal,
                    //shrinkWrap: true,
                    controller: _scrollController,
                    itemCount: playersList.length,
                    itemBuilder: (BuildContext context, int index) {
                      return PlayerStory(user: playersList[index].user);
                    },
                  ),
    //...
    
    class PlayerStory extends StatefulWidget {
      const PlayerStory({
        super.key,
        required this.user,
      });
    
      final User user;
    
      @override
      State<PlayerStory> createState() => _PlayerStoryState();
    }
    
    class _PlayerStoryState extends State<PlayerStory> {
      @override
      Widget build(BuildContext context) {
        double avancedAvatarSize = 17.w;
        double dyOffset = -10.0;
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: InkWell(
            onTap: () {
              showPopover(
                context: context,
                transitionDuration: const Duration(milliseconds: 150),
                backgroundColor: Theme.of(context).primaryColor,
                bodyBuilder: (ctx) {
                  return MultiBlocProvider(
                    providers: [
                      BlocProvider.value(
                        value: BlocProvider.of<HealthCalculationCubit>(context),
                      ),
                      BlocProvider.value(
                        value: BlocProvider.of<UserBloc>(context),
                      ),
                      BlocProvider.value(
                        value: BlocProvider.of<PlayersBloc>(context),
                      ),
                      BlocProvider.value(
                        value: BlocProvider.of<GameBloc>(context),
                      ),
                    ],
                    child: Padding(
                      padding: const EdgeInsets.all(30.0),
                      child: BlocListener<PlayersBloc, PlayersState>(
                        listener: (ctx, state) {
                          if (state.players!.every(
                              (player) => player!.user!.id != widget.user.id)) {
                            Navigator.pop(ctx);
                          }
                        },
                        child: Container(//...
                        ),
                      ),
                    ),
                  );
                },
                onPop: () => print('Popover was popped!'),
                isParentAlive: () => mounted,
                direction: PopoverDirection.bottom,
                radius: 5.w,
                width: 90.w,
                arrowDyOffset: dyOffset,
                contentDyOffset: dyOffset,
              );
            },
            child: AnimatedContainer(//...
            ),
          ),
        );
      }
    }
    
    help wanted 
    opened by JFtechOfficial 5
  • Popover doesn't show up from AppBar

    Popover doesn't show up from AppBar

    when the showPopOver method is called from an IconButton placed in the AppBar the popover doesn't show up, my app bar looks like this:

    AppBar(
              title: const Text('Popover Example'),
              actions: [
                IconButton(
                  icon: Icon(Icons.sort),
                  onPressed: () {
                    showPopover(
                      context: context,
                      bodyBuilder: (context) => const ListItems(),
                      onPop: () => print('Popover was popped!'),
                      direction: PopoverDirection.top,
                      width: 200,
                      height: 400,
                      arrowHeight: 15,
                      arrowWidth: 30,
                    );
                  },
                ),
              ],
            )
    
    duplicate wontfix 
    opened by murad1981 5
  • Popover should adjust its size when keyboard is shown/hidden

    Popover should adjust its size when keyboard is shown/hidden

    Native iOS popovers track the software keyboard events and reposition themselves if necessary, when the keyboard is shown/hidden. If the popover overlaps with the keyboard it is:

    • moved above the keyboard, if there is enough room to show it
    • resized to fit the area over the keyboard, if the original popover was too big to fit

    Your popover implementation does a great job in showing the popovers that do not have input fields. E.g. lists of choices. But if popover needs to collect some user's input, we still have to use flutter dialog. It could be great if we could use popovers, as they feel more at home, when on iOS.

    I do not know if it helps, but we use keyboard_avoider in our application to make the parts that should not overlap with keyboard auto-resize. It is abandoned and not-null safe. But perhaps could be used as a reference.

    invalid 
    opened by rasmk 3
  • Add fade animation as an alternative to default scale one

    Add fade animation as an alternative to default scale one

    Is your feature request related to a problem? Please describe. Popover used in gtk apps has a fade transition to open instead of scale one, So this package doesn't match consisitency.

    Describe the solution you'd like Add a way for users to specify there own transitions or add default transitions enum which contains Scale and Fade as a value and user can choose that when calling showPopover.

    Describe alternatives you've considered ...

    Additional context Libadwaita library uses fade animation for the popover so we need it.

    opened by prateekmedia 3
  • How to close the popover by pressed a close button in body Widget?

    How to close the popover by pressed a close button in body Widget?

    something like this

    Widget _test(){
     return OutlinedButton(
            child: Text("close this popover"),
            onPressed: () {
               // close this popover
              // ....?
            }
      )
    }
    
    Widget _show(){
      return GestureDetector(
          onTap: () {
            showPopover(
                width: ScreenUtil.getScreenW(context),
                context: context,
                radius: 0,
                arrowHeight: 0,
                arrowWidth: 0,
                bodyBuilder: (context) =>  _test(counter));
       })
    }
    
    opened by timmyLan 3
  • Space between popover and widget that fired popover

    Space between popover and widget that fired popover

    Describe the bug Space between popover and child.

    To Reproduce Source:

      final bool isStop;
      final ComponentData componentData;
      final NodeData nodeData;
      final ComponentDesignPolicy policy;
    
      XBaseNode(
          {Key? key,
          required this.nodeData,
          required this.componentData,
          this.isStop = false,
          required this.policy})
          : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          decoration: BoxDecoration(
              borderRadius: BorderRadius.all(
                Radius.circular(10),
              ),
              boxShadow: [
                BoxShadow(
                  color: Colors.black,
                  blurRadius: 2.0,
                  spreadRadius: 0.0,
                  offset: Offset(2.0, 2.0), // shadow direction: bottom right
                )
              ],
              color: Colors.white),
          child: isStop
              ? Container(
                  width: 35,
                  height: 35,
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.all(
                        Radius.circular(10),
                      ),
                      color: Colors.green),
                  child: Center(
                    child: Icon(
                      nodeData.iconData,
                      color: Colors.white,
                    ),
                  ),
                )
              : Column(
                  children: [
                    Row(
                      children: [
                        Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Container(
                            width: 35,
                            height: 35,
                            decoration: BoxDecoration(
                                borderRadius: BorderRadius.all(
                                  Radius.circular(10),
                                ),
                                color: Colors.green),
                            child: Center(
                              child: Icon(
                                nodeData.iconData,
                                color: Colors.white,
                              ),
                            ),
                          ),
                        ),
                        SizedBox(
                          width: 30,
                        ),
                        Text(
                          nodeData.title,
                          style: TextStyle(fontWeight: FontWeight.bold),
                        ),
                      ],
                    ),
                    Divider(),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(nodeData.description),
                    ),
                    SizedBox(
                      height: 30,
                    ),
                    if ((componentData.data as NodeData)
                        .possibleTriggers
                        .contains(WorkflowNodeConnectorTrigger.Receive))
                      addTrigger(),
                    Visibility(
                      visible: showMessageText(componentData.data),
                      child: addMessageNodeContent(
                        (componentData.data as NodeData),
                      ),
                    ),
                    Container(
                      width: 80,
                      height: 40,
                      decoration: const BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.all(Radius.circular(5)),
                        boxShadow: [
                          BoxShadow(color: Colors.black26, blurRadius: 5)
                        ],
                      ),
                      child: GestureDetector(
                        child: const Center(child: Text('Click Me')),
                        onTap: () {
                          showPopover(
                            context: context,
                            transitionDuration: const Duration(milliseconds: 150),
                            bodyBuilder: (context) => EditNodeDataDialog(
                                componentData: componentData,
                                data: componentData.data as NodeData),
                            onPop: () => print('Popover was popped!'),
                            direction: PopoverDirection.right,
                            width: 300,
                            height: 500,
                          );
                        },
                      ),
                    )
                  ],
                ),
        );
      }
    
      bool showMessageText(NodeData data) {
        return data.data is MessageNodeData;
      }
    
      Widget addMessageNodeContent(NodeData data) {
        if (data.data is MessageNodeData) {
          var messageData = data.data as MessageNodeData;
          return Text(messageData.text);
        }
        return Container();
      }
    
      Widget addTrigger() {
        return XConnectToMenu(
          child: Padding(
            padding:
                const EdgeInsets.only(left: 16.0, right: 16.0, top: 8, bottom: 8),
            child: Row(
              children: [
                Icon(
                  Icons.input,
                  color: Colors.green,
                ),
                SizedBox(
                  width: 30,
                ),
                Text(
                  "On receive",
                  style: TextStyle(
                      color: nodeData.hasLinkedTrigger(
                              WorkflowNodeConnectorTrigger.Receive,
                              componentData.id)
                          ? Colors.red
                          : Colors.blue,
                      fontWeight: nodeData.hasLinkedTrigger(
                              WorkflowNodeConnectorTrigger.Receive,
                              componentData.id)
                          ? FontWeight.bold
                          : FontWeight.normal),
                ),
              ],
            ),
          ),
          possibleConnections: possibleConnections(),
          sourceId: componentData.id,
        );
      }
    
      List<WorkflowNodeType> possibleConnections() {
        var currentComponentData = componentData.data as NodeData;
        var currentComponentType = currentComponentData.type;
        var possibleConnections = WorkflowNodeType.values.where((element) =>
            element != WorkflowNodeType.Start && element != currentComponentType);
        return possibleConnections.toList();
      }
    }
    
    class ListItems extends StatelessWidget {
      const ListItems({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scrollbar(
          child: Padding(
            padding: const EdgeInsets.symmetric(vertical: 8),
            child: ListView(
              padding: const EdgeInsets.all(8),
              children: [
                InkWell(
                  onTap: () {},
                  child: Container(
                    height: 50,
                    color: Colors.amber[100],
                    child: const Center(child: Text('Entry A')),
                  ),
                ),
                const Divider(),
                Container(
                  height: 50,
                  color: Colors.amber[200],
                  child: const Center(child: Text('Entry B')),
                ),
                const Divider(),
                Container(
                  height: 50,
                  color: Colors.amber[300],
                  child: const Center(child: Text('Entry C')),
                ),
              ],
            ),
          ),
        );
      }
    } 
    
    

    Expected behavior Popover next to calling widget

    Screenshots image

    Desktop (please complete the following information):

    • OS: macOs

    Any suggestions?

    opened by jordandevogelaere 3
  • Update popover_render_shifted_box.dart

    Update popover_render_shifted_box.dart

    Replace this paragraph with a description of what this PR is changing or adding, and why. Consider including before/after screenshots.

    List which issues are fixed by this PR. You must list at least one issue.

    Pre-launch Checklist

    • [x] I read and followed the Effective Dart.
    • [x] I listed at least one issue or feature that this PR fixes or adds in the description above.
    • [x] I updated/added relevant documentation (doc comments with ///).
    • [ ] I updated/added relevant documentation to README.md.
    • [ ] I updated/added relevant code samples to example.
    • [ ] I added new tests to check the change I am making or feature I am adding, or Minikin said the PR is test-exempt.
    • [ ] All existing and new tests are passing.

    If you need help, consider asking for advice on Twitter.

    Thank you for your contribution 🚀!

    opened by alexwan02 3
  • Popover breaks when opened to the right

    Popover breaks when opened to the right

    Describe the bug When I try to open the popover to the right it breaks

    To Reproduce Steps to reproduce the behavior:

    1. Download example repo
    2. Set PopoverDirection.right in direction

    Expected behavior Displayed popover don't breaks

    Screenshots Снимок экрана 2021-02-07 в 22 50 18

    Desktop (please complete the following information):

    • OS: Mac OS
    • Browser Chrome
    • Version 88.0.4324.150

    Additional context Add any other context about the problem here.

    bug 
    opened by KyKyPy3 3
  • popOver triangle position not changing on device orientation changed

    popOver triangle position not changing on device orientation changed

    Describe the bug popOver triangle position not changing on device orientation changed, works only on item tap

    Desktop (please complete the following information):

    • OS: [e.g. iOS]
    • Browser [e.g. chrome, safari]
    • Version [e.g. 22]

    Smartphone (please complete the following information):

    • Device: Nexus 10
    • OS: Android API 29
    waiting for customer feedback 
    opened by Temurxon77 2
  • How to set the popover's location?

    How to set the popover's location?

    If a widget's width is large, the popover will be shown from the widget's bottom left, not center. How can I choose to show the popover's location? Thanks.

    opened by Ssiswent 0
  • not showing any popover

    not showing any popover

    when i try to show by calling showPopOver() i got just effect like alert dialog box not and popover so pls solve this issue i searched lots of but i can not find solution out there.

    waiting for customer feedback 
    opened by jayu1023 5
Releases(v0.2.8)
Owner
Sasha Prokhorenko
Software engineer & occasional sound producer.
Sasha Prokhorenko
A web dashboard that allows you to monitor your Chia farm and sends notifications when blocks are found and new plots are completed through a discord bot. It can link multiple farmers/harvesters to your account.

farmr A web dashboard that allows you to monitor your Chia farm and sends notifications when blocks are found and new plots are completed through a di

Gil Nobrega 261 Nov 10, 2022
Flutter Installer is an installer for Flutter built with Flutter 💙😎✌

Flutter Installer Flutter Installer is an installer for Flutter built with Flutter ?? ?? ✌ Flutter and the related logo are trademarks of Google LLC.

Yazeed AlKhalaf 406 Dec 27, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app window.

bitsdojo_window A Flutter package that makes it easy to customize and work with your Flutter desktop app window on Windows, macOS and Linux. Watch the

Bits Dojo 607 Jan 4, 2023
Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size.

desktop_window Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size. Usage import 'package:desktop_window/desktop_window.dart

ChunKoo Park 72 Dec 2, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app's system tray.

system_tray A Flutter package that that enables support for system tray menu for desktop flutter apps. on Windows, macOS and Linux. Features: - Modify

AnTler 140 Dec 30, 2022
Fluttern is a web app made with Flutter to list Flutter internships/jobs for the community.

Fluttern Fluttern is a web app made with Flutter to list Flutter internships/jobs for the community. It uses Google Sheet as a backend, simplifying th

Aditya Thakur 3 Jan 5, 2022
Flutter on Windows, MacOS and Linux - based on Flutter Embedding, Go and GLFW.

go-flutter - A package that brings Flutter to the desktop Purpose Flutter allows you to build beautiful native apps on iOS and Android from a single c

null 5.5k Jan 6, 2023
A clean front-end plugin to Volumio, the Linux distribution for music playback. Volumio Touch Display Lite is written in Flutter and runs on flutter-pi.

EN | 中文 Touch Display Lite plugin for Volumio 3 Feng Zhou, 2021-12 Touch Display Lite is a clean and fast user interface for Volumio 3, the Linux dist

Feng Zhou 5 Jul 26, 2022
Ubuntu-flutter-plugins - A collection of Flutter plugins and packages for Ubuntu applications.

Flutter plugins for Ubuntu A collection of Flutter plugins and packages for Ubuntu applications. ubuntu_localizations - provides localizations for Flu

Canonical 25 Oct 12, 2022
File picker plugin for Flutter, compatible with mobile (iOS & Android), Web, Desktop (Mac, Linux, Windows) platforms with Flutter Go support.

A package that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.

Miguel Ruivo 987 Jan 6, 2023
Flutter Community Plus Plugins

Flutter Community Plus Plugins Plus plugins PlusPlugins is a set of Flutter plugins that is developed based on existing Flutter plugins with extra fun

Flutter Community 1.1k Jan 5, 2023
Flutter plugin to store data behind biometric authentication (ie. fingerprint)

biometric_storage Encrypted file store, optionally secured by biometric lock for Android, iOS, MacOS and partial support for Linux, Windows and Web. M

AuthPass 125 Dec 28, 2022
The Chicago widget set for Flutter

Chicago widget library The Chicago widget set is a retro 32-bit desktop design language for Flutter. It was discussed in the Building a desktop design

Todd Volkert 405 Dec 30, 2022
🎞 Flutter media playback, broadcast & recording library for Windows, Linux & macOS. Written in C++ using libVLC & libVLC++. (Both audio & video)

dart_vlc Flutter media playback, broadcast, recording & chromecast library for Windows, Linux & macOS. Written in C++ using libVLC & libVLC++. Install

Hitesh Kumar Saini 417 Dec 29, 2022
Flutter plugins used in Mixin

flutter-plugins This repo contains the source code for Flutter plugins which used in Mixin. Check the packages directory for all plugins. Plugins Plug

Mixin Network 246 Jan 3, 2023
Implements Microsoft's Fluent Design System in Flutter.

fluent_ui Design beautiful native windows apps using Flutter Unofficial implementation of Fluent UI for Flutter. It's written based on the official do

Bruno D'Luka 1.8k Dec 30, 2022
Windows95 UI components for Flutter apps. Bring back the nostalgic look and feel of old operating systems with this set of UI components ready to use.

Flutter95 Windows95 UI components for Flutter apps. UNDER CONSTRUCTION Screenshots Components Scaffold95 Scaffold as a Windows95 styled window. Provid

Miguel Beltran 141 Dec 26, 2022
Flutter library for window blur & transparency effects for on Windows & Linux. 💙

flutter_acrylic Window blur & transparency effects for Flutter on Windows & Linux Installation Mention in your pubspec.yaml. dependencies: ... flu

Hitesh Kumar Saini 437 Dec 31, 2022
A Javascript engine to use with flutter. It uses quickjs on Android and JavascriptCore on IOS

Flutter JS plugin A Javascript engine to use with flutter. Now it is using QuickJS on Android through Dart ffi and JavascriptCore on IOS also through

Ábner Oliveira 334 Jan 3, 2023