Various eBay tools for Flutter development

Last update: May 9, 2022

Flutter Glove Box

Contains various testing tools that eBay Motors App team is using in their development on daily basis.

License Information

Copyright 2019-2020 eBay Inc.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of eBay Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

GitHub

https://github.com/eBay/flutter_glove_box
Comments
  • 1. Add fileNameFactory for further customization

    This PR adds a so called fileNameFactory to multiScreenGolden and screenMatchesGolden which allows further customization of the file name which is used to compare.

    Use Cases

    The newly added function allows one to structure the files differently. For example one can change the naming scheme and put all files to another folder (not to goldens/). In addition to that one can change the multiScreenGolden file names to include the width and height instead of the device name.

    Tests

    I've added tests for both multiScreenGolden and screenMatchesGolden to ensure the desired effect. The PR is fully backwards compatible so no existing test had to be changed.

    Related Issues

    Fixes: https://github.com/eBay/flutter_glove_box/issues/45

    Reviewed by christian-muertz at 2020-05-25 08:49
  • 2. WIP: Find all Image widgets and precache them before comparing

    Instead of calling matchesGoldenFile twice to prime all images, find all Image widgets and precache them so they are available instantly afterwards.

    I am not sure if this is enough because their could probably be other assets that are not images which are not loaded this way.

    Reviewed by christian-muertz at 2020-05-25 09:07
  • 3. loadAppFonts() will fail if package does not contain any image assets.

    For a currently unknown reason, if a package does not contain any images, then the FontManifest.json is not generated, even if it depends on other packages with fonts/images

    We need to investigate if this is a bug in Flutter or working as intended. If working as intended, we may need to come up with an alternative solution for loading fonts.

    Reviewed by coreysprague at 2020-03-12 21:11
  • 4. Need to add to 'overridable fonts' for package font to be displayed

    We have an issue in our app that requires us to add overridable fonts for the fonts to be rendered in golden tests, even though they work fine when running the app. The fonts come from one of our own packages, and the styles which we refer to from our app are also defined within the package.

    Our current app setup/structure is as follows: In the app pubspec.yaml we have fonts defined as follows

    flutter:
      fonts:
        - family: AvenirNext
          fonts:
            - asset: packages/package_name/fonts/AvenirNext-Regular.ttf
              weight: 400
    

    We use the fonts within our app as follows:

    Text(
       'blah blah',
       style: context.textThemeDefinedInPackage.bodyDefault,
    ),
    

    Our current package setup/structure is as follows: In the package pubspec.yaml we have fonts defined as follows

    flutter:
      fonts:
        - family: AvenirNext
          fonts:
            - asset: lib/fonts/AvenirNext-Regular.ttf
              weight: 400
    

    We define styles within our package as follows:

    TextStyle(fontFamily: 'AvenirNext')
    

    When we generate golden files (when using the style define in the package as shown above), we just see the squares instead of the fonts being rendered correctly. If we explicitly create a style in our text widgets the font is displayed in the golden test. For example:

    Text(
       'this works'
       style: TextStyle(fontFamily: 'AvenirNext', package: 'plentific_ui_core'),
    ),
    Text(
       'this also works'
       style: TextStyle(fontFamily: 'packages/plentific_ui_core/AvenirNext'),
    ),
    Text(
       'this DOES NOT work in golden tests but does in the app'
       style: TextStyle(fontFamily: 'AvenirNext'),
    ),
    

    The only way I have been able to get the fonts rendering in golden tests (when using the styles defined in the package) is to add 'AvenirNext' to the list of overridableFonts in the golden toolkit package font loader file. Now I have found a more elegant way to enable this, by adding an argument, additionalOverridableFonts to the loadAppFonts() method, however I thought I would run it by you guys first and see if anyone else has experienced similar issues, or if there are any other workarounds I have not found. If not, I can create a non-breaking PR with my fix.

    Reviewed by guy-plentific at 2022-04-25 09:25
  • 5. Tag golden tests

    This is a very optimistic approach but maybe there is not much more involved.

    I can't get my tests to succeed when using the package as local dependency. I have golden diffs of 0.x% related to fonts. This happens on master as well so it is not related to this change.

    • [x] add tests
    Reviewed by kuhnroyal at 2021-08-02 14:16
  • 6. Adds 'DeviceBuilder' factory and helper 'multiDeviceGolden' method to create single golden files for multiple Device configurations and scenarios

    Problem statement:

    Capturing golden files for a screen that has multiple differences across device sizes and multiple complicated ui states.

    Current package says to use 'multiScreenGolden' for the same widget rendered in multiple device sizes (i.e Device.phone, Device.tabletLandscape). This however, produces a single png golden file per device. When adding multiple scenarios/states for that screen and needing still to see across multiple devices, this can grow the number of files considerably.

    Proposed solution:

    DeviceBuilder factory

    The DeviceBuilder class allows user to create multiple scenarios across multiple devices in a single png golden file. The example added was around the default flutter counter view and capturing ui based on user taps.

      testGoldens('DeviceBuilder - multiple scenarios - with afterPump',
          (tester) async {
        final builder = DeviceBuilder()
          ..overrideDevicesForAllScenarios(devices: [
            Device.phone,
            Device.iphone11,
            Device.tabletPortrait,
            Device.tabletLandscape,
          ])
          ..addDeviceScenario(
            widget: FlutterDemoPage(),
            name: 'default page',
          )
          ..addDeviceScenario(
            widget: FlutterDemoPage(),
            name: 'tap once',
            afterPump: (scenarioWidgetKey) async {
              final finder = find.descendant(
                of: find.byKey(scenarioWidgetKey),
                matching: find.byIcon(Icons.add),
              );
              expect(finder, findsOneWidget);
              await tester.tap(finder);
            },
          )
          ..addDeviceScenario(
            widget: FlutterDemoPage(),
            name: 'tap five times',
            afterPump: (scenarioWidgetKey) async {
              final finder = find.descendant(
                of: find.byKey(scenarioWidgetKey),
                matching: find.byIcon(Icons.add),
              );
              expect(finder, findsOneWidget);
    
              await tester.tap(finder);
              await tester.tap(finder);
              await tester.tap(finder);
              await tester.tap(finder);
              await tester.tap(finder);
            },
          );
    
        await tester.pumpDeviceBuilder(builder);
    
        await screenMatchesGolden(tester, 'flutter_demo_page_multiple_scenarios');
      });
    

    The DeviceBuilder exposes an 'afterPump' callback to perform any interactions required to render the scenario across all device sizes. For simpler widgets/screens where a ui state can be instantiated statically through construction, then the 'afterPump' functionality wouldn't be needed.

    This produces a single golden file:

    flutter_demo_page_multiple_scenarios

    The simplest use of this doesn't require you to call overrideDevicesForAllScenarios, as by default it will use GoldenToolkit.configuration.defaultDevices. You can also omit scenario name parameter to.

    final builder = DeviceBuilder()..addDeviceScenario( widget: FlutterDemoPage());
    

    multiDeviceGolden

    This is a helper method much like the existing multiScreenGolden, except that it produces one single golden file instead of multiple per device. This method can be used if you just one a single scenario and don't need to use DeviceBuilder directly.

      testGoldens('multiDeviceGolden', (tester) async {
        await multiDeviceGolden(
          tester,
          'flutter_demo_multi_device_golden',
          widget: FlutterDemoPage(),
          afterPump: (scenarioWidgetKey) async {
            final finder = find.descendant(
              of: find.byKey(scenarioWidgetKey),
              matching: find.byIcon(Icons.add),
            );
            expect(finder, findsOneWidget);
            await tester.tap(finder);
          },
        );
      });
    

    Other fixes

    The current tests were not passing on latest flutter stable 1.22.1. Had to regenerate some golden files. Also had issues with analysis options when opening root folder and looking at weather_widgets.dart. So ignored some issues in there to help analysis step pass.

    Reviewed by moonytoes29 at 2020-10-14 12:43
  • 7. Goldens for different devices seem to influence each other.

    The Goldens look as follows if I run them with respectively.

    ..overrideDevicesForAllScenarios(devices: [
            Device.iphone11,
            // Device.phone,
          ])
          
          
    ..overrideDevicesForAllScenarios(devices: [
            Device.phone,
          ])
    
    
    Screenshot 2021-06-11 at 14 21 08 Screenshot 2021-06-11 at 14 50 21

    Running them with the following setup messes up both tests.

    ..overrideDevicesForAllScenarios(devices: [
            Device.iphone11,
            Device.phone,
          ])
    
    
    Screenshot 2021-06-11 at 14 49 49

    So the tests seem to influence each other :S

    Reviewed by marcoAtEnvidual at 2021-06-11 12:53
  • 8. Missing null safety support / Library is legacy

    Trying to use golden_toolkit with a null safe library will generate the following warning:

    The library 'package:golden_toolkit/golden_toolkit.dart' is legacy, and should not be imported into a null safe library. Try migrating the imported library.

    This is because there is no -nullsafety version for golden_toolkit yet.

    Quoting from the email that has been sent to applicable package authors:

    You can find information on the migration at dart.dev/null-safety, including links to a migration guide and frequently asked questions.

    Reviewed by creativecreatorormaybenot at 2020-11-28 19:12
  • 9. docs: flutter_test_config fix

    When the main method in flutter_test_config.dart is named as "main", an exception is thrown looking for testExecutable. Renaming my main method to testExecutable runs tests fine.

    Reviewed by srix55 at 2020-11-13 07:51
  • 10. Different font rendering between Unix and macOS

    I tried the golden toolkit and it works great on my machine. I'm working on a MacBook with macOS 10.15.6.

    Our CI is running on a unix machine and the golden tests always fail. On the first look the screens look the same. If you look carefully, you can see little differences around texts. Obviously the anti aliasing works diffently.

    If my colleague creates the goldens on his unix machine, they match on the CI.

    I already tried to turn off the font smoothing in the macOS system settings. Then the rendered text is looking diffently than with smoothing. But also still differently from unix.

    Is there anything we can do about? Or can you fix that in the toolkit?

    Reviewed by neustaTerasa at 2020-11-11 22:02
  • 11. loadAppFonts() failed to load a customer icon font existing in another package of app (not for golden tests but) for regular tests

    I have an app with multiple packages such as adapter, model, theme and ui scaffolded by melos So, as you might assume, custom icon font for app exists in theme package, not in ui package.

    As golden_toolkit's documentation, I have this flutter_test_config.dart.

    Future<void> testExecutable(FutureOr<void> Function() testMain) async {
      return GoldenToolkit.runWithConfiguration(
        () async {
          await loadAppFonts();
          await testMain();
        },
        config: GoldenToolkitConfiguration(
          skipGoldenAssertion: () => !Platform.isMacOS,
        ),
      );
    }
    

    loadAppFonts() runs fine for golden tests "flutter test --update-goldens --tags=golden" but causes the following error with my app setup as "flutter test --coverage --no-test-assets --exclude-tags=golden" runs.

    Failed to load "<SNIP>/packages/ui/test/home/widgets/greeting.widget_test.dart": Unable to load asset: FontManifest.json
      package:flutter/src/services/asset_bundle.dart 237:7  PlatformAssetBundle.load
      ===== asynchronous gap ===========================
      package:flutter/src/services/asset_bundle.dart 72:27  AssetBundle.loadString
    

    My workaround for now is to take out "await loadAppFonts();" from flutter_test_config.dart and put it to each golden tests. Then, both commands for regular tests and golden tests run fine.

    Nevertheless, regarding loadAppFonts(), if rootBundle.loadStructuredData() is related to the problem above, can it check if assets in other packages?

    In ui package's pubspec.yaml "theme" package is pointed this way,

    theme:
        path: ../theme
    

    and theme package's pubspec.yaml has assets defined.

    flutter:
      uses-material-design: true
      assets:
        - assets/images/
        - google_fonts/
    
      fonts:
        - family: MyAppIcon
          fonts:
            - asset: assets/icons/MyAppIcon.ttf
    
    Reviewed by chunghha at 2021-10-25 17:16
  • 12. Update testing_tools.dart

    Hi, thank you for publishing this package! It is so useful for us!

    I found a subtle need. pumpDeviceBuilder does not have textScaleSize argument, so I added it!

    Reviewed by takassh at 2022-04-12 05:20
  • 13. showModalBottomSheet with DraggableScrollableSheet failure during golden tests

    Let's say, we'd like to display draggable bottom sheet, which height is 200. It's snaps are 0 (closed) and 1 (fully opened).

    When we wrote such code and run on any device - it works fine. But when we try to write golden tests for such case, it fails.

    Source code

        showModalBottomSheet<void>(
          context: context,
          constraints: const BoxConstraints(
            maxHeight: 200,
          ),
          builder: (_) {
            return DraggableScrollableSheet(
              minChildSize: 0.0,
              initialChildSize: 1.0,
              snap: true,
              snapSizes: const [0.0, 1.0],
              builder: (context, scrollController) {
                return Container(
                  color: Colors.blue,
                );
              },
            );
          },
        );
    

    See entire demo project.

    How to reproduce

    Run flutter test.

    Failure cause

    Seems like DraggableScrollableSheet's builer requires scrollable Widget with controller passed into constructor when it's displayed by showModalBottomSheet.

    How to fix

    Wrap sheet's content into scrollable widget with NeverScrollableScrollPhysics and pass scrollController into such widget.

        showModalBottomSheet<void>(
          context: context,
          constraints: const BoxConstraints(
            maxHeight: 200,
          ),
          builder: (_) {
            return DraggableScrollableSheet(
              minChildSize: 0.0,
              initialChildSize: 1.0,
              snap: true,
              snapSizes: const [0.0, 1.0],
              builder: (context, scrollController) {
                return CustomScrollView(
                  controller: scrollController,
                  physics: const NeverScrollableScrollPhysics(),
                  slivers: [
                    SliverFillRemaining(
                      child: Container(
                        color: Colors.blue,
                      ),
                    ),
                  ],
                );
              },
            );
          },
        );
    

    Stack trace

    00:03 +1: MyHomePage golden tests shows bottom sheet                                                      
    ══╡ EXCEPTION CAUGHT BY SCHEDULER LIBRARY ╞═════════════════════════════════════════════════════════
    The following assertion was thrown during a scheduler callback:
    ScrollController not attached to any scroll views.
    'package:flutter/src/widgets/scroll_controller.dart':
    Failed assertion: line 107 pos 12: '_positions.isNotEmpty'
    
    Either the assertion indicates an error in the framework itself, or we should provide substantially
    more information in this error message to help you determine and fix the underlying cause.
    In either case, please report this assertion by filing a bug on GitHub:
      https://github.com/flutter/flutter/issues/new?template=2_bug.md
    
    When the exception was thrown, this was the stack:
    #2      ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:107:12)
    #3      _DraggableScrollableSheetScrollController.position (package:flutter/src/widgets/draggable_scrollable_sheet.dart:725:13)
    #4      _DraggableScrollableSheetState._replaceExtent.<anonymous closure> (package:flutter/src/widgets/draggable_scrollable_sheet.dart:656:27)
    #5      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
    #6      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1089:9)
    #7      AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:995:9)
    #10     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
    #11     AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:982:27)
    #12     WidgetTester.pump.<anonymous closure> (package:flutter_test/src/widget_tester.dart:608:53)
    #15     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
    #16     WidgetTester.pump (package:flutter_test/src/widget_tester.dart:608:27)
    #17     _twoPumps (package:golden_toolkit/src/multi_screen_golden.dart:18:16)
    #18     multiScreenGolden.<anonymous closure> (package:golden_toolkit/src/multi_screen_golden.dart:71:30)
    #19     multiScreenGolden.<anonymous closure> (package:golden_toolkit/src/multi_screen_golden.dart:66:13)
    #20     WidgetFlutterBindingExtensions.runWithDeviceOverrides (package:golden_toolkit/src/widget_tester_extensions.dart:32:17)
    <asynchronous suspension>
    <asynchronous suspension>
    (elided 7 frames from class _AssertionError, dart:async, and package:stack_trace)
    ════════════════════════════════════════════════════════════════════════════════════════════════════
    ══╡ EXCEPTION CAUGHT BY SCHEDULER LIBRARY ╞═════════════════════════════════════════════════════════
    The following assertion was thrown during a scheduler callback:
    ScrollController not attached to any scroll views.
    'package:flutter/src/widgets/scroll_controller.dart':
    Failed assertion: line 107 pos 12: '_positions.isNotEmpty'
    
    Either the assertion indicates an error in the framework itself, or we should provide substantially
    more information in this error message to help you determine and fix the underlying cause.
    In either case, please report this assertion by filing a bug on GitHub:
      https://github.com/flutter/flutter/issues/new?template=2_bug.md
    
    When the exception was thrown, this was the stack:
    #2      ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:107:12)
    #3      _DraggableScrollableSheetScrollController.position (package:flutter/src/widgets/draggable_scrollable_sheet.dart:725:13)
    #4      _DraggableScrollableSheetState._replaceExtent.<anonymous closure> (package:flutter/src/widgets/draggable_scrollable_sheet.dart:656:27)
    #5      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
    #6      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1089:9)
    #7      AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:995:9)
    #10     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
    #11     AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:982:27)
    #12     WidgetTester.pump.<anonymous closure> (package:flutter_test/src/widget_tester.dart:608:53)
    #15     TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
    #16     WidgetTester.pump (package:flutter_test/src/widget_tester.dart:608:27)
    #17     _twoPumps (package:golden_toolkit/src/multi_screen_golden.dart:18:16)
    #18     multiScreenGolden.<anonymous closure> (package:golden_toolkit/src/multi_screen_golden.dart:71:30)
    #19     multiScreenGolden.<anonymous closure> (package:golden_toolkit/src/multi_screen_golden.dart:66:13)
    #20     WidgetFlutterBindingExtensions.runWithDeviceOverrides (package:golden_toolkit/src/widget_tester_extensions.dart:32:17)
    <asynchronous suspension>
    <asynchronous suspension>
    (elided 7 frames from class _AssertionError, dart:async, and package:stack_trace)
    ════════════════════════════════════════════════════════════════════════════════════════════════════
    ══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
    The following message was thrown:
    Multiple exceptions (2) were detected during the running of the current test, and at least one was
    unexpected.
    ════════════════════════════════════════════════════════════════════════════════════════════════════
    00:03 +1 -1: MyHomePage golden tests shows bottom sheet [E]                                               
      Test failed. See exception logs above.
      The test description was: shows bottom sheet
      
    00:04 +2 -1: Some tests failed.
    
    Reviewed by grafovdenis at 2022-03-25 09:35
  • 14. How to perform golden test of screen having loading state ?

    class RootScreen extends StatelessWidget {
      const RootScreen({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Center(
                  child: Padding(
                padding: const EdgeInsets.only(
                  bottom: 200,
                ),
                child: Text(
                  'Test',
                ),
              )),
              const Center(
                child: CircularProgressIndicator(),
              ),
           
              Text('Loading...',)
            ],
          ),
        );
      }
    }
    
    Reviewed by pranavo72bex at 2022-03-10 03:16
  • 15. question on where to store goldens

    Hi, would like to know if there have been any git performance implications on storing golden images within the repository? Is there a way to store goldens within git LFS? or a CDN for comparison? Is that even necessary? Slightly concerned in potentially storing a large amount of goldens (along with revisions) in git. Not sure though if this should truly be a concern.

    Thanks.

    Reviewed by andrewescutia at 2022-03-07 20:29
  • 16. [golden_toolkit] Problem with TextPainter inside CustomPainer

    Well I have this problem, I'm trying to display text inside a canvas using a TextPainter inside a CustomPainer object, in a CutomPaint widget. But it has a problem in the goldens, it displays single colored rectangles instead of letter or characters, similar to what happen to regular Text widgets without calling to loadAppFonts first. This just happens to TextPainters, not to Text widgets. Anyone know how to solve this? Thanks in advance.

    Reviewed by perojas3 at 2022-02-06 16:15
  • 17. [golden_toolkit] Add teardown surface size, physical size and pixel ratio

    The current implementation changes some properties for the test window and does not set them back to the default values. This is making some other test to fail as they use the default screen size provided by the test framework.

    https://github.com/eBay/flutter_glove_box/blob/b8cf5746aa495d14b6b23980eb9500885cea7af9/packages/golden_toolkit/lib/src/testing_tools.dart#L117-L128

    I would like to propose to add there the following:

        addTearDown(() async {
          await binding.setSurfaceSize(null);
          binding.window.clearPhysicalSizeTestValue();
          binding.window.clearDevicePixelRatioTestValue();
          binding.window.clearTextScaleFactorTestValue();
        });
    

    So after the golden test is finished, the test values are rested to the default ones

    Reviewed by jamesblasco at 2022-02-01 09:15

Related

This is an auction application just like eBay. Using firebase as the backend for signup & sign-in functionality. In addition to that, it's a two pages application with user bid in input and count down view.
This is an auction application just like eBay. Using firebase as the backend for signup & sign-in functionality.  In addition to that, it's a two pages application with user bid in input and count down view.

Nilam This is an auction application just like eBay. Using firebase as the backend for signup & sign-in functionality. In addition to that, it's a two

May 23, 2022
Aq flutter tools - AQ flutter tools - Responsive Images, Translations and more
Aq flutter tools - AQ flutter tools - Responsive Images, Translations and more

Made by AQuadic Getting started Important Links AQuadic Script Requirement This

Feb 7, 2022
A container image with flutter and various CI tools.

flutter-ci-tools A Docker container built from the cirrusci/flutter image, with various CI tools. Project Notes With the available tools you can: depl

Jan 12, 2022
[Flutter SDK V.2] - Youtube Video is a Flutter application built to demonstrate the use of Modern development tools with best practices implementation like Clean Architecture, Modularization, Dependency Injection, BLoC, etc.
[Flutter SDK V.2] - Youtube Video is a Flutter application built to demonstrate the use of Modern development tools with best practices implementation like Clean Architecture, Modularization, Dependency Injection, BLoC, etc.

[Flutter SDK V.2] - Youtube Video is a Flutter application built to demonstrate the use of Modern development tools with best practices implementation like Clean Architecture, Modularization, Dependency Injection, BLoC, etc.

May 11, 2022
Redesign Unsplash Mobile Application with flutter tools.
Redesign Unsplash Mobile Application with flutter tools.

flutter_splash Redesign Unsplash Mobile Application with flutter tools. About its open source application based Unsplash API for training Flutter , Di

Sep 5, 2021
Devtools - Performance tools for Flutter

Dart & Flutter DevTools What is this? Dart & Flutter DevTools is a suite of performance tools for Dart and Flutter. Getting started For documentation

May 20, 2022
A set of useful sliver tools that are missing from the flutter framework
A set of useful sliver tools that are missing from the flutter framework

sliver_tools A set of useful sliver tools that are missing from the flutter framework. Here is a taste what you can make using this package The struct

May 18, 2022
A PC client to control mobiles by adb tools in Flutter.

mobile_controller A new Flutter project for PC to control mobiles by adb tool. Develop in progress, not release yet... Features Provide computer contr

Mar 6, 2022
Provide powerfull tools to help you build your Flutter design system.
Provide powerfull tools to help you build your Flutter design system.

Provide powerfull tools to help you build your design system. About flutter_design contains packages to help you bootstrap your design system with a w

Apr 2, 2022
PalestineDevelopers is an open-source tools code-base

PalestineDevelopers مبادرة لإحياء إسم فلسطين بتقديم أدوات برمجية تحمل إسم أرض الميعاد Flutter Packages .. will be replaced .. will be replaced .. will

Jan 4, 2022
All the tools you need to build an app in 2 minutes

All the tools you need to build an app in 2 minutes. This is the main, standard CC Core. The plan is to make this into smaller, independent modules, but for now we are making it all available.

Dec 30, 2021
Custom bottom bar - A bottom tool bar that can be swiped left or right to expose more tools.
Custom bottom bar - A bottom tool bar that can be swiped left or right to expose more tools.

custom_bottom_bar A bottom tool bar that can be swiped left or right to expose more tools. usage Create your custom bottom bars with up to four custom

Jan 26, 2020
ABC of Flutter widgets. Intended for super beginners at Flutter. Play with 35+ examples in DartPad directly and get familiar with various basic widgets in Flutter
ABC of Flutter widgets. Intended for super beginners at Flutter. Play with 35+ examples in DartPad directly and get familiar with various basic widgets in Flutter

Basic Widgets Examples This is aimed for complete beginners in Flutter, to get them acquainted with the various basic widgets in Flutter. Run this pro

May 13, 2022
Feb 9, 2022
A basic template of Flutter to get started. Includes various folders and packages that might be necessary.
A basic template of Flutter to get started. Includes various folders and packages that might be necessary.

Flutter App - Basic Template It's a time saving template with basic project structure, packages and other files like constants.dart to get started rat

May 9, 2022
A basic template of Flutter to get started. Includes various folders and packages that might be necessary.
A basic template of Flutter to get started. Includes various folders and packages that might be necessary.

Flutter App - Basic Template It's a time saving template with basic project structure, packages and other files like constants.dart to get started rat

May 9, 2022
A TabBarController that is easy to use for flutter developers. 🥰 It supports various styles of page navigation, and you can also use it to customize your favorite styles. 🍻🍻
A TabBarController that is easy to use for flutter developers. 🥰 It supports various styles of page navigation, and you can also use it to customize your favorite styles. 🍻🍻

easy_tab_controller A user-friendly TabBarController widget for flutter developer. Getting Started This project is a starting point for a Flutter plug

Aug 31, 2021
A carousel package in flutter with various configuration options
A carousel package in flutter with various configuration options

Flutter_Carosel A simple Carousel Widget with multiple configuration option. ... dependencies: ... flutter_multi_carousel: ^1.0.0 ... And install it

May 3, 2022
Flutter package that provides you custom clippers to help you achieve various custom shapes.
Flutter package that provides you custom clippers to help you achieve various custom shapes.

flutter_custom_clippers Flutter package that provides you custom clippers to help you achieve various custom shapes. Usage To use this plugin, add flu

Apr 15, 2022