React hooks for Flutter. Hooks are a new kind of object that manages a Widget life-cycles. They are used to increase code sharing between widgets and as a complete replacement for StatefulWidget.

Overview

English | Português

Build codecov pub package pub package

Flutter Hooks

A Flutter implementation of React hooks: https://medium.com/@dan_abramov/making-sense-of-react-hooks-fdbde8803889

Hooks are a new kind of object that manages a Widget life-cycles. They exist for one reason: increase the code-sharing between widgets by removing duplicates.

Motivation

StatefulWidget suffers from a big problem: it is very difficult to reuse the logic of say initState or dispose. An obvious example is AnimationController:

class Example extends StatefulWidget {
  final Duration duration;

  const Example({Key key, required this.duration})
      : super(key: key);

  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> with SingleTickerProviderStateMixin {
  AnimationController? _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this, duration: widget.duration);
  }

  @override
  void didUpdateWidget(Example oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.duration != oldWidget.duration) {
      _controller!.duration = widget.duration;
    }
  }

  @override
  void dispose() {
    _controller!.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

All widgets that desire to use an AnimationController will have to reimplement almost all of this from scratch, which is of course undesired.

Dart mixins can partially solve this issue, but they suffer from other problems:

  • A given mixin can only be used once per class.
  • Mixins and the class shares the same object.
    This means that if two mixins define a variable under the same name, the result may vary between compilation fails to unknown behavior.

This library proposes a third solution:

class Example extends HookWidget {
  const Example({Key key, required this.duration})
      : super(key: key);

  final Duration duration;

  @override
  Widget build(BuildContext context) {
    final controller = useAnimationController(duration: duration);
    return Container();
  }
}

This code is strictly equivalent to the previous example. It still disposes the AnimationController and still updates its duration when Example.duration changes. But you're probably thinking:

Where did all the logic go?

That logic moved into useAnimationController, a function included directly in this library (see Existing hooks). It is what we call a Hook.

Hooks are a new kind of objects with some specificities:

  • They can only be used in the build method of a widget that mix-in Hooks.

  • The same hook is reusable an infinite number of times The following code defines two independent AnimationController, and they are correctly preserved when the widget rebuild.

    Widget build(BuildContext context) {
      final controller = useAnimationController();
      final controller2 = useAnimationController();
      return Container();
    }
  • Hooks are entirely independent of each other and from the widget.
    This means they can easily be extracted into a package and published on pub for others to use.

Principle

Similarly to State, hooks are stored on the Element of a Widget. But instead of having one State, the Element stores a List<Hook>. Then to use a Hook, one must call Hook.use.

The hook returned by use is based on the number of times it has been called. The first call returns the first hook; the second call returns the second hook, the third returns the third hook, ...

If this is still unclear, a naive implementation of hooks is the following:

class HookElement extends Element {
  List<HookState> _hooks;
  int _hookIndex;

  T use<T>(Hook<T> hook) => _hooks[_hookIndex++].build(this);

  @override
  performRebuild() {
    _hookIndex = 0;
    super.performRebuild();
  }
}

For more explanation of how they are implemented, here's a great article about how they did it in React: https://medium.com/@ryardley/react-hooks-not-magic-just-arrays-cd4f1857236e

Rules

Due to hooks being obtained from their index, some rules must be respected:

DO always prefix your hooks with use:

Widget build(BuildContext context) {
  // starts with `use`, good name
  useMyHook();
  // doesn't start with `use`, could confuse people into thinking that this isn't a hook
  myHook();
  // ....
}

DO call hooks unconditionally

Widget build(BuildContext context) {
  useMyHook();
  // ....
}

DON'T wrap use into a condition

Widget build(BuildContext context) {
  if (condition) {
    useMyHook();
  }
  // ....
}

About hot-reload

Since hooks are obtained from their index, one may think that hot-reload while refactoring will break the application.

But worry not, HookWidget overrides the default hot-reload behavior to work with hooks. Still, there are some situations in which the state of a Hook may get reset.

Consider the following list of hooks:

useA();
useB(0);
useC();

Then consider that after a hot-reload, we edited the parameter of HookB:

useA();
useB(42);
useC();

Here everything works fine; all hooks keep their states.

Now consider that we removed HookB. We now have:

useA();
useC();

In this situation, HookA keeps its state but HookC gets a hard reset. This happens because when a refactoring is done, all hooks after the first line impacted are disposed of. Since HookC was placed after HookB, it got disposed of.

How to use

There are two ways to create a hook:

  • A function

    Functions are by far the most common way to write a hook. Thanks to hooks being composable by nature, a function will be able to combine other hooks to create a custom hook. By convention, these functions will be prefixed by use.

    The following defines a custom hook that creates a variable and logs its value on the console whenever the value changes:

    ValueNotifier<T> useLoggedState<T>(BuildContext context, [T initialData]) {
      final result = useState<T>(initialData);
      useValueChanged(result.value, (_, __) {
        print(result.value);
      });
      return result;
    }
  • A class

    When a hook becomes too complex, it is possible to convert it into a class that extends Hook, which can then be used using Hook.use.
    As a class, the hook will look very similar to a State and have access to life-cycles and methods such as initHook, dispose and setState It is usually a good practice to hide the class under a function as such:

    Result useMyHook(BuildContext context) {
      return use(const _TimeAlive());
    }

    The following defines a hook that prints the time a State has been alive.

    class _TimeAlive extends Hook<void> {
      const _TimeAlive();
    
      @override
      _TimeAliveState createState() => _TimeAliveState();
    }
    
    class _TimeAliveState extends HookState<void, _TimeAlive> {
      DateTime start;
    
      @override
      void initHook() {
        super.initHook();
        start = DateTime.now();
      }
    
      @override
      void build(BuildContext context) {}
    
      @override
      void dispose() {
        print(DateTime.now().difference(start));
        super.dispose();
      }
    }

Existing hooks

Flutter_hooks comes with a list of reusable hooks already provided.

They are divided into different kinds:

Primitives

A set of low-level hooks that interacts with the different life-cycles of a widget

name description
useEffect Useful for side-effects and optionally canceling them.
useState Create variable and subscribes to it.
useMemoized Cache the instance of a complex object.
useContext Obtain the BuildContext of the building HookWidget.
useValueChanged Watches a value and calls a callback whenever the value changed.

Object binding

This category of hooks allows manipulating existing Flutter/Dart objects with hooks. They will take care of creating/updating/disposing an object.

dart:async related:

name description
useStream Subscribes to a Stream and return its current state in an AsyncSnapshot.
useStreamController Creates a StreamController automatically disposed.
useFuture Subscribes to a Future and return its current state in an AsyncSnapshot.

Animation related:

name description
useSingleTickerProvider Creates a single usage TickerProvider.
useAnimationController Creates an AnimationController automatically disposed.
useAnimation Subscribes to an Animation and return its value.

Listenable related:

name description
useListenable Subscribes to a Listenable and mark the widget as needing build whenever the listener is called.
useValueNotifier Creates a ValueNotifier automatically disposed.
useValueListenable Subscribes to a ValueListenable and return its value.

Misc

A series of hooks with no particular theme.

name description
useReducer An alternative to useState for more complex states.
usePrevious Returns the previous argument called to [usePrevious].
useTextEditingController Create a TextEditingController
useFocusNode Create a FocusNode
useTabController Creates and disposes a TabController.
useScrollController Creates and disposes a ScrollController.
usePageController Creates and disposes a PageController.
useIsMounted An equivalent to State.mounted for hooks

Contributions

Contributions are welcomed!

If you feel that a hook is missing, feel free to open a pull-request.

For a custom-hook to be merged, you will need to do the following:

  • Describe the use-case.

    Open an issue explaining why we need this hook, how to use it, ... This is important as a hook will not get merged if the hook doens't appeal to a large number of people.

    If your hook is rejected, don't worry! A rejection doesn't mean that it won't be merged later in the future if more people shows an interest in it. In the mean-time, feel free to publish your hook as a package on https://pub.dev.

  • Write tests for your hook

    A hook will not be merged unles fully tested, to avoid breaking it inadvertendly in the future.

  • Add it to the Readme & write documentation for it.

Issues
  • Why no initState?

    Why no initState?

    I'm a bit confused why there is no equivalent of the initState fxn. If I had an animation and wanted it to play from 0 to 1, only once, when the widget is first created, how would I do that? I can see how you could use a custom isFirstBuild state value, but that seems kinda hacky compared to just having a dedicated init fxn. Am I missing something?

    wontfix 
    opened by esDotDev 46
  • Dispose in reverse order

    Dispose in reverse order

    Currently, flutter_hooks disposes hooks from the top down, which is strange considering that Flutter itself disposes states from the bottom up. This causes exceptions when removing ChangeNotifier listeners that get cleaned up by useEffect's disposal callback.

    enhancement 
    opened by ds84182 29
  • useFuture/useStream: does initialData need to be required?

    useFuture/useStream: does initialData need to be required?

    At 0.16.0 with nullsafety useFuture gets required T initialData parameter: https://github.com/rrousselGit/flutter_hooks/blob/2b02b99ce6b327fd3a6df6f9c52cb2fe791600f6/lib/src/async.dart#L11-L15

    This means when there is no initial data, one have to explicitly pass null:

    final snapshot = useFuture(future, initialData: null);
    

    Are there any benefits of making it required?

    opened by PiN73 26
  • add deactivate method to HookState

    add deactivate method to HookState

    works like AutomaticKeepAliveClientMixin

    opened by sahandevs 17
  • Example Gallery

    Example Gallery

    Hey hey -- I wanted to play with hooks and get a feel for them.

    I started creating a couple of one-off examples and my own hooks to internalize the concepts and ended up creating a kind of Gallery.

    I decided this might be a nice addition to the repo. It's incomplete, but I can add more examples and much more documentation if this looks like something you're interested in!

    Todo

    • [ ] Update README
    • [ ] Add documentation for each step of each example
    • [ ] Example Functional Hook
    • [ ] Example Class-based Hook
    • [ ] useMemoized
    • [ ] useStreamController & Friends
    • [ ] useAnimationController & Friends
    opened by brianegan 16
  • Q: Very curious if folks are finding this as useful as it sounds ...

    Q: Very curious if folks are finding this as useful as it sounds ...

    I love the hook stuff in react, and this looks very nice too ... just wary of the "sounds too good to be true" thing ... any thoughts from folks that have used this heavily?

    opened by aktxyz 14
  • Destroying HookWidget?

    Destroying HookWidget?

    Am I doing something wrong? I keep getting odd memory leaks with my HookWidgets and I assume that I just need to clean things up when widget is destroyed, but there are no methods available.

    Here is some code:

    class StaticMapWidget extends HookWidget {
      Spot spot;
    
      _VM vm;
    
      StaticMapWidget(this.spot) {
        vm = _VM(spot);
      }
    }
    
    class _VM {
      Spot spot;
      VM(this.spot);
    
      //some helper methods
    }
    

    Am I allowed to do this with HookWidgets, passing parameters and having local instances of classes? Do I need to clean them up when widget is destroyed or unused references would be just GC-ed from memory?

    opened by AAverin 14
  • Null safety migration

    Null safety migration

    General question since ValueNotifier has a non null generic i have implemented a second useState and useValueNotifier hook for nullable types: useNullableState and useNullableValueNotifier. Do you think this is the way to go or do you have a better idea? @rrousselGit

    I also just removed all tests that are no longer necessary because of null safety.

    opened by DevNico 13
  • why is the implementation of useEffect different from React hooks useEffect?

    why is the implementation of useEffect different from React hooks useEffect?

    documentation for useEffect on react hooks page

    The function passed to useEffect will run after the render is committed to the screen.

    Flutter hooks synchronously executes the function which will lead in a different result as expected (coming from react hooks).

    React also offers a hook called uselayouteffect that is more similar to flutter hooks useEffect.

    https://github.com/rrousselGit/flutter_hooks/issues/34 might be more similar to reacts useEffect.

    Kind of confusing 😩 Maybe @rrousselGit can clarify some things here :)

    opened by smiLLe 12
  • Add support for using RestorableProperty with hook

    Add support for using RestorableProperty with hook

    This PR adds support for managing RestorablePropertys with the help of a hook and HookRestorationScope.

    opened by blaugold 12
  • `HookWidget with more/less hooks than previously` seems to be not allowed

    `HookWidget with more/less hooks than previously` seems to be not allowed

    Describe what scenario you think is uncovered by the existing examples/articles

    It is now allowed to rebuild a HookWidget with more/less hooks than previously. Example: https://github.com/rrousselGit/flutter_hooks/blob/master/packages/flutter_hooks/CHANGELOG.md#0110

    It seems that this isn't allowed in fact as mentioned here: https://github.com/rrousselGit/river_pod/discussions/711

    Describe why existing examples/articles do not cover this case

    Additional context

    The note deleted at https://github.com/rrousselGit/flutter_hooks/commit/ecbffc75c6280e9ec1992f5b9360c9b89b018869#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5, should be re-added.

    documentation needs triage 
    opened by mono0926 0
  • UseEffect doesn't fire after render

    UseEffect doesn't fire after render

    I'm trying to convert this code to hooks:

    @override void initState(){ super.initState(); WidgetsBinding.instance.addPostFrameCallback((_){ .... // code after first render ); }); }

    when I convert this to hooks:

    useEffect(() { WidgetsBinding.instance!.addPostFrameCallback((_) => ...// code after render; }, [VARIABLE_TRIGGERS_HOOK]);

    it runs "BEFORE" the render. I tried adding delays but still the same problem

    question 
    opened by sasarivera 5
  • pub.dev example page link needs to be updated

    pub.dev example page link needs to be updated

    On https://pub.dev/packages/flutter_hooks/example the example link has not been updated when the repo moved to the multiple package structure. On click of the link one now lands on a 404.

    Pls update the link to redirect to https://github.com/rrousselGit/flutter_hooks/blob/master/packages/flutter_hooks/example/lib/main.dart

    documentation needs triage 
    opened by JustinHorn 0
  • Add flutter_mobx_hooks and add didBuild event on hook state

    Add flutter_mobx_hooks and add didBuild event on hook state

    fix https://github.com/rrousselGit/flutter_hooks/issues/225

    Just a preview to see if I'm on the right track. Once we agree on the feature I'll do the associated tests

    opened by jaumard 33
  • hooks with provider building whole screen rather than specific hook or widget

    hooks with provider building whole screen rather than specific hook or widget

    when I try to obscure text using provider or setstate() it rebuild the whole screen rather then the just textformfield. Is there any other I can do that?

    import 'package:flutter/material.dart';
    import 'package:flutter_hooks/flutter_hooks.dart';
    import 'package:provider/provider.dart';
    
    enum Index { email, password }
    
    TextFormField useTextFormField(Index index) {
      return use(_CustomHook(index: index));
    }
    
    class _CustomHook extends Hook<TextFormField> {
      final Index index;
    
      _CustomHook({@required this.index});
    
      @override
      _CustomHookState createState() => _CustomHookState();
    }
    
    class _CustomHookState extends HookState<TextFormField, _CustomHook> {
      Index index;
      @override
      TextFormField build(BuildContext context) {
      final visibility = Provider.of<VisibilityProvider>(context);
        return TextFormField(
          decoration: InputDecoration(
            hintText: 'some help',
            suffixIcon: IconButton(
              onPressed: () {
                visibility.changeVisibility();
              //  setState(() {
                 // obscure = !obscure;
              //  });
              },
              icon: Icon(obscure ? Icons.visibility_off : Icons.visibility),
            ),
          ),
          validator: (text) {
            if (text.isEmpty) return 'enter something';
            return null;
          },
          obscureText: index == Index.email ? false : visibility.visible,
        );
      }
    }
    
    opened by Ujas-Majithiya 1
  • Add postBuild event

    Add postBuild event

    Is your feature request related to a problem? Please describe. I want to create a custom hook to replace Observer from mobx to his hook equivalent, from our discussion on slack you told me it was not possible until hooks have postBuild event.

    So I would like to work on this and make a PR, can you give me more details of what need to be done in order to add that event ? Some specs so I don't start wrong :)

    Thanks! Really love hooks!

    enhancement 
    opened by jaumard 3
  • Add useCupertinoTabController

    Add useCupertinoTabController

    We already have useTabController. Why not have the useCupertinoTabController for everyone that uses the flutter/cupertino.dart library?

    enhancement 
    opened by Albert221 1
  • Bad state: Type mismatch between hooks: - previous hook: TabControllerHook - new hook: _SingleTickerProviderHook

    Bad state: Type mismatch between hooks: - previous hook: TabControllerHook - new hook: _SingleTickerProviderHook

    I'm getting the error while I'm using tabController with Hookwidget. below is my TabControllerHook class TabControllerHook extends Hook { final int length; final int initialIndex;

    const TabControllerHook(this.length, this.initialIndex);

    @override HookState<TabController, TabControllerHook> createState() { return _TabControllerHookState(); } }

    class _TabControllerHookState extends HookState<TabController, TabControllerHook> { @override build(BuildContext context) { final tickerProvider = useSingleTickerProvider(); final controller = useMemoized(() => TabController(length: hook.length, vsync: tickerProvider, initialIndex: hook.initialIndex), [tickerProvider]);

    useEffect(() {
      return controller.dispose;
    }, [controller]);
    
    return controller;
    

    } }

    ** and use the above hook in my home screen like below** class Home extends HookWidget {

    TabController tabController; HomeViewModel viewModel;

    @override Widget build(BuildContext context){ viewModel = useProvider(homeViewModel); tabController = use(TabControllerHook(2, 0));

    } }

    I don't understand from where this issue is generating?

    bug 
    opened by coderGirl9796 5
  • A TabController was used after being disposed.

    A TabController was used after being disposed.

    I am trying to rebuild my tabController depending on some feature flags being on or off.

    final featureFlags = useState(database.getFeatureFlags());
    database.featureFlagsBox.watch(key: "feature_flags").listen((event) {
          featureFlags.value = event.value;
        });
    final allPages = useMemoized(() {
          return _buildPages(featureFlags.value);
        }, [featureFlags.value]);
    final _ticker = useSingleTickerProvider();
    final _tabController = useTabController(initialLength: allPages.length, vsync: _ticker, keys: [featureFlags.value]);
    

    Doing that results in and error:

    The following assertion was thrown building CollectionsPage(dirty, dependencies: [_EffectiveTickerMode, _LocalizationsScope-[GlobalKey#13ef1], _InheritedTheme], useState<FeatureFlags>: Instance of 'FeatureFlags', useMemoized<List<PageViewDescription>>: [Instance of 'PageViewDescription'], useSingleTickerProvider):
    A TabController was used after being disposed.
    
    Once you have called dispose() on a TabController, it can no longer be used.
    The relevant error-causing widget was: 
      CollectionsPage .../lib/components/screens/home/HomeScreen.dart:44:67
    When the exception was thrown, this was the stack: 
    #0      ChangeNotifier._debugAssertNotDisposed.<anonymous closure> (package:flutter/src/foundation/change_notifier.dart:117:9)
    #1      ChangeNotifier._debugAssertNotDisposed (package:flutter/src/foundation/change_notifier.dart:123:6)
    #2      ChangeNotifier.dispose (package:flutter/src/foundation/change_notifier.dart:212:12)
    #3      TabController.dispose (package:flutter/src/material/tab_controller.dart:299:11)
    #4      _TabControllerHookState.dispose (package:flutter_hooks/src/tab_controller.dart:57:33)
    

    Probably related to https://github.com/rrousselGit/flutter_hooks/issues/81

    bug needs triage 
    opened by AAverin 0
Owner
Remi Rousselet
Flutter enthusiast. You'll find me on stackoverflow. Or as a speaker in Flutter meetups
Remi Rousselet
Simple form maker for Flutter Framework

Flutter FormBuilder - flutter_form_builder This package helps in creation of data collection forms in Flutter by removing the boilerplate needed to bu

Danvick Miller 929 Dec 1, 2021
A multiplatform Dart movie app with 40% of code sharing between Flutter and the Web.

A multiplatform Dart movie app with 40% of code sharing between Flutter and the Web.

Iiro Krankka 3.2k Nov 24, 2021
A TypeAhead widget for Flutter, where you can show suggestions to users as they type

Flutter TypeAhead A TypeAhead (autocomplete) widget for Flutter, where you can show suggestions to users as they type Features Shows suggestions in an

null 554 Nov 22, 2021
📸 Easy to use yet very customizable zoomable image widget for Flutter, Photo View provides a gesture sensitive zoomable widget. Photo View is largely used to show interacive images and other stuff such as SVG.

Flutter Photo View A simple zoomable image/content widget for Flutter. PhotoView enables images to become able to zoom and pan with user gestures such

Fire Slime Games 1.5k Nov 29, 2021
I was challenged to create an app with only the Nubank life insurance part and fix some UI issues.

Seguros I was challenged to create an App with only the Nubank life insurance part and fix some UI issues. Flutter This is a Flutter App, designed bas

Caio Moura 15 Aug 3, 2021
Flutter Advanced: ARCore Tutorial | Sceneform | Exploring New Possibilities || Exploring New Possibilities

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

Pawan Kumar 54 Jul 28, 2021
This Dart package offers developers a streamlined library of Flutter widgets, useful for expanding widgets and text views, when users interact with them.

This Dart package offers developers a streamlined library of Flutter widgets, useful for expanding widgets and text views, when users interact with them.

Jesús Rodríguez 42 Aug 12, 2021
Hooks but for and of Flutter

reactives A new way for Flutter to reuse/group common logic. Think of them like React hooks but for and of flutter. Idea copied from the lit world Mot

Ripe Mango 11 Nov 8, 2021
(Complete flutter application) Exam and training app as social media, prepared with Firebase backend services, Bloc State management, Singleton design pattern, Unit and widget tests, firebase mocking, Custom local libraries, etc.

(Complete flutter application) Exam and training app as social media, prepared with Firebase backend services, Bloc State management, Singleton design pattern, Unit and widget tests, firebase mocking, Custom local libraries, etc.

Ismael Shakverdiev 48 Nov 25, 2021
A flutter package which makes it easier to display the difference between two images.

?? Before After A flutter package which makes it easier to display the differences between two images.. The source code is 100% Dart, and everything r

Sahil Kumar 575 Nov 26, 2021
Flutter Advanced: TensorFlow Lite | Object Detection | YoloV2 | SSD Tutorial ||| SSD Tutorial

tflite_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 t

Pawan Kumar 65 Nov 23, 2021
A basic demo example for integrating between Appwrite & Flutter 💙

?? Quiz With Flutter A simple Quiz App built with Flutter and Appwrite ?? Getting Started ?? Install Appwrite Follow our simple Installation Guide to

Appwrite 14 Nov 17, 2021
Flutter shareable package of object-oriented classes for local caching of user data in json

json_cache Json Cache is an object-oriented package to serve as a layer on top of local storage packages - packages that persist data locally on the u

Dartoos 6 Aug 26, 2021
Learn to Code While Building Apps - The Complete Flutter Development Bootcamp

Learn to Code While Building Apps - The Complete Flutter Development Bootcamp

London App Brewery 8.2k Nov 23, 2021
Obfuscate sensitive data in your pictures before sharing them online.

Privacy Blur A cross-platform application to obfuscate sensitive data from images, targeting iOS and Android devices. Mainly written in dart with the

MATHEMA GmbH 26 Nov 26, 2021
Platform to post/say something without sharing personal information.

Anon is an Open Source Application where it's users will be able to share their thoughts without their identity being revealed i.e Anonymous. When the

Ismael Shakverdiev 16 Oct 22, 2021
A Dart library for creating a Dart object to represent directory trees.

Directory Tree A Dart library for creating a Dart object to represent directory trees. Getting Started Import and initialize package import 'package:d

Chiziaruhoma Ogbonda 4 Jul 5, 2021
Trying out Flutter for desktop Web app development as an alternative to SPA frameworks (such as React and Angular) by recreating one of the pages of an existing CV Management web app

HTML Renderer Demo CanvasKit Renderer Demo Reddit discussion This repo contains a PoC of using Flutter as a traditional SPA framework for creating a d

Maxim Saplin 11 Nov 8, 2021
Plant Manager is an application that was developed on Rocketseat NLW5 with React Native but was rebuilt using Flutter.

Technologies | Project | Layout | License ?? Technologies This project was developed with the following technologies: Flutter ?? Project Plant Manager

Mayderson 7 Aug 11, 2021
Flutter React Golang WebRTC等技术学习笔记

study-notes Flutter React Golang WebRTC等技术学习笔记 学习资源 除了一些文章外,亢老师还精心录制了一些视频教程供大家学习. 国内用户请查看核心系列课程(国内). 海外华人用户请查看核心系列课程(海外), 支持paypal支付.可放心购买 核心系列课程(国内)

亢少军 6 Oct 21, 2021
GitHub action to react on the empty issue

Crystal Ball Crystal ball is an easy app to check if github an issue can be consider as invalid or dummy. It's also a GitHub action which simplify usa

Marcin Niemira 3 Sep 3, 2021
Code generation for Flutter Padding widgets based on your constants

Paddinger Paddinger is a Flutter package to generate Padding widgets. Given a set of constants like: @paddinger const double PADDING_NORMAL = 8; A set

Emanuele 10 Oct 19, 2021
A code generator to write widgets as function without loosing the benefits of classes.

Widgets are cool. But classes are quite verbose: class Foo extends StatelessWidget { final int value; final int value2; const Foo({Key key, thi

Remi Rousselet 432 Dec 1, 2021
Calendar widget for flutter that is swipeable horizontally. This widget can help you build your own calendar widget highly customizable.

flutter_calendar_carousel Calendar widget for flutter that is swipeable horizontally. This widget can help you build your own calendar widget highly c

dooboolab 682 Nov 29, 2021
Allows widgets to be zoomed in and out by inserting a OverlayEntry which allows the widget to be on the front at all times.

zoom_pinch_overlay An instagram style pinch and zoom widget for all platform completely written in pure dart! All other "zoom_pinch" package doesnt di

Samuel 11 Oct 16, 2021
A Flutter package which can be used to make polylines(route) from a source to a destination, and also handle a driver's realtime location (if any) on the map.

GoogleMapsWidget For Flutter A widget for flutter developers to easily integrate google maps in their apps. It can be used to make polylines from a so

Rithik Bhandari 4 Nov 17, 2021
An easy to use side menu in flutter and can used for navigations

Easy Sidemenu Easy sidemenu is An easy to use side menu (bar) for flutter that you can use for navigations in your application. Sidemenu is a menu tha

Mohammad Jamalianpour 16 Oct 7, 2021