A set of useful sliver tools that are missing from the flutter framework

Overview

sliver_tools

pub package

A set of useful sliver tools that are missing from the flutter framework.

Here is a taste what you can make using this package

Demo

The structure of this app:

class Section extends State {
  @override
  Widget build(BuildContext context) {
    return MultiSliver(
      pushPinnedChildren: true,
      children: <Widget>[
        SliverPersistentHeader(
          pinned: true,
          ...
        ),
        if (!infinite)
          SliverAnimatedPaintExtent(
            child: SliverList(...),
          )
        else
          SliverList(...),
      ],
    );
  }
}

class NewsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        Section(infinite: false),
        Section(infinite: true),
      ],
    );
  }
}

MultiSliver

The MultiSliver widget allows for grouping of multiple slivers together such that they can be returned as a single widget. For instance when one wants to wrap a few slivers with some padding or an inherited widget.

Example

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiSliver(
      pushPinnedChildren: false, // defaults to false
      children: <Widget>[
        SliverPersistentHeader(...),
        SliverList(...),
      ],
    );
  }
}

The pushPinnedChildren parameter allows for achieving a 'sticky header' effect by simply using pinned SliverPersistentHeader widgets (or any custom sliver that paints beyond its layoutExtent).

SliverStack

The SliverStack widget allows for stacking of both slivers and box widgets. This can be useful for adding some decoration to a sliver. Which is what some of the other widgets in this package use to get their desired effects.

Example

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverStack(
      insetOnOverlap: false, // defaults to false
      children: <Widget>[
        SliverPositioned.fill(
          child: Container(
            decoration: BoxDecoration(
              color: Colors.white,
              boxShadow: const <BoxShadow>[
                BoxShadow(
                  offset: Offset(0, 4),
                  blurRadius: 8,
                  color: Colors.black26,
                )
              ],
              borderRadius: BorderRadius.circular(8),
            ),
          ),
        )
        SliverList(...),
      ],
    );
  }
}

The insetOnOverlap handles whether the positioned children should be inset (made smaller) when the sliver has overlap from a previous sliver.

SliverClip

The SliverClip widget will add a clip around its child from the child's paintOrigin to its paintExtent. This is very useful and most likely what you want when using a pinned SliverPersistentHeader as child of the stack.

Example

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverClip(
      clipOverlap: true, // defaults to true
      child: SliverList(...),
    );
  }
}

The clipOverlap parameter allows for configuring whether any overlap with the previous child should be clipped. This can be useful when one has a SliverPersitentHeader above a SliverList and does not want to give the header an opaque background but also prevent the list from drawing underneath the header.

SliverAnimatedPaintExtent

The SliverAnimatedPaintExtent widget allows for having a smooth transition when a sliver changes the space it will occupy inside the viewport. For instance when using a SliverList with a button below it that loads the next few items.

Example

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverAnimatedPaintExtent(
      duration: const Duration(milliseconds: 150),
      child: SliverList(...),
    );
  }
}

SliverAnimatedSwitcher

The SliverAnimatedSwitcher widget is simply a pre-configured AnimatedSwitcher widget. If one needs more options than supplied by this widget a regular AnimatedSwitcher can be used by giving it the defaultLayoutBuilder and defaultTransitionBuilder of SliverAnimatedSwitcher.

SliverCrossAxisConstrained

The SliverCrossAxisConstrained widget allows for limiting the cross axis extent of a sliver to a maximum value given by the maxCrossAxisExtent. For instance a long list of text items on an iPad would be too wide to read so one can wrap the SliverList in a SliverCrossAxisConstrained and limit its width to something more reasonable.

Example

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverCrossAxisConstrained(
      maxCrossAxisExtent: 700,
      child: SliverList(...),
    );
  }
}

SliverCrossAxisPadded

The SliverCrossAxisPadded widget allows for adding padding to the cross axis of a sliver. This can be done either by passing a paddingStart and/or paddingEnd or by using the symmetric constructor which takes a single padding value. When using paddingStart and paddingEnd in a vertical sliver it will depend on the TextDirection whether start is left or right.

Example

class WidgetThatReturnsASliver extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverCrossAxisPadded(
      paddingStart: 24,
      paddingEnd: 48,
      textDirection: TextDirection.ltr, // optional, defaults to the Directionality specified by the context
      child: SliverList(...),
    );
  }
}

SliverPinnedHeader

The SliverPinnedHeader widget allows for easily making a pinned header. It will size itself to the size of the child and when it reaches the leading edge of the viewport stay there instead of scrolling off the screen.

Buy me a coffee ☕️

Buy Me A Coffee

Comments
  • SliverPinnedHeader Enhancement

    SliverPinnedHeader Enhancement

    Hi @Kavantix,

    Thx for your awesome package! It makes Sliver more flexible and powerful!

    I am wondering if it is possible to introduce more prop to control SliverPinnedHeader.

    Such as a position to set where to pin (e.g. pin at the 300px from top) and a controller to control when to pin?

    I think this may also solve #20 request

    opened by Peng-Qian 12
  • Floating point rounding warning

    Floating point rounding warning

    Hi,

    I'm seinng an issue where the remaingPaintExtent and the paintOrigin + paintExtent are different based on some rounding errors with the MultiSliver component. The issue appeared when adding a CupertinoSliverRefreshControl to a MultiSliver and it happens during the swipe up experience. I don't have an easy example at hand but if necessary could try to create one.

    The issue happens somewhere around here: https://github.com/Kavantix/sliver_tools/blob/master/lib/src/multi_sliver.dart#L298

    I/flutter (16253): The remainingPaintExtent is 200.2530827300063, but the paintOrigin + paintExtent is
    I/flutter (16253): 200.25308273000633.
    I/flutter (16253): Maybe you have fallen prey to floating point rounding errors, and should explicitly apply the min()
    I/flutter (16253): or max() functions, or the clamp() method, to the paintOrigin + paintExtent?
    I/flutter (16253): The paintOrigin and paintExtent must cause the child sliver to paint within the viewport, and so
    I/flutter (16253): cannot exceed the remainingPaintExtent.
    

    I tried a local fix with the change documented below but my experience working with Slivers is not very big right now so I am not sure if this is a good fix or not?

        geometry = SliverGeometry(
          paintOrigin: minPaintOrigin,
          scrollExtent: precedingScrollExtent,
          paintExtent: min(totalPaintExtent - minPaintOrigin, constraints.remainingPaintExtent), // This is the change
          maxPaintExtent: maxPaintExtent - minPaintOrigin,
          layoutExtent: layoutExtent,
          cacheExtent: constraints.remainingCacheExtent - remainingCacheExtent,
          hasVisualOverflow: hasVisualOverflow,
          maxScrollObstructionExtent: maxScrollObstructionExtent,
          visible: visible && paintExtent > 0,
        );
    

    So I am wondering if this is a bug in the library or not? And if yex, Is my fix correct or is there a better way to fix it?

    Thanks for the great library and your input.

    opened by jseminck 10
  • SliverGeometry is not valid: The

    SliverGeometry is not valid: The "maxPaintExtent" is less than the "paintExtent". with MultiSliver usage

    Usage MultiSliver with SliverAppBar leads to exception SliverGeometry is not valid: The "maxPaintExtent" is less than the "paintExtent".

    Scaffold(
        body: CustomScrollView(
          slivers: [
            const SliverAppBar(
              pinned: true,
              title: Text('Sample'),
            ),
            MultiSliver(
              children: [
                SliverToBoxAdapter(
                  child: Container(
                    height: 30, ///<--- changing this value to height bigger than app bar fixes issue
                  ),
                ),
              ]
            ),
            MultiSliver(
                children: [
                  SliverList(
                    delegate: SliverChildBuilderDelegate(
                      (context, index) {
                        return Container(
                          height: 50,
                          width: double.infinity,
                          color: index.isEven ? Colors.red : Colors.blue,
                        );
                      },
                      childCount: 20,
                    ),
                  ),
                  const SliverToBoxAdapter(
                    child: Divider(),
                  ),
                ]
            ),
          ],
        ),
      );
    

    Flutter version: 2.0.5 Device: Android 11 (API 30) (emulator)

    opened by TatsuUkraine 9
  • Feature request: MultiSliver.builder

    Feature request: MultiSliver.builder

    I would like to make a view like the schedule view of a calendar app.

    A list view that is infinite in both direction, that can be indexed and that can have sticky header.

    I am trying to adapt https://pub.dev/packages/indexed_list_view to support sliver children, I have thinking of returning MultiSliver instead of a SliverFixedExtentList, to be able to put SliverStickyHeader into the indexedlist.

    Yeah not so simple !

    So I would need a MultiSliver with a builder function.

    If you have any feedback, this is very welcome :)

    I looked everywhere and couldn't find anything.. maybe I am missing something obvious.

    Thanks

    invalid 
    opened by cgestes 7
  • FlutterException: Null check operator used on a null value

    FlutterException: Null check operator used on a null value

    Stack:

    #0      RenderSliverStack.performLayout (package:sliver_tools/src/rendering/sliver_stack.dart:190)
    #1      RenderObject.layout (package:flutter/src/rendering/object.dart:1915)
    #2      RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:510)
    #3      RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1580)
    #4      RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1489)
    #5      RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1757)
    #6      PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887)
    #7      RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:504)
    #8      WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:892)
    #9      RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370)
    #10     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146)
    #11     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083)
    #12     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997)
    #13     _rootRun (dart:async/zone.dart:1426)
    #14     _CustomZone.run (dart:async/zone.dart:1328)
    #15     _CustomZone.runGuarded (dart:async/zone.dart:1236)
    #16     _invoke (dart:ui/hooks.dart:151)
    #17     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308)
    #18     _drawFrame (dart:ui/hooks.dart:115)
    
    opened by LGang 6
  • MultiSliver with several pinned headers in NestScrollView headerSliverBuilder need overscrolling to overlap

    MultiSliver with several pinned headers in NestScrollView headerSliverBuilder need overscrolling to overlap

    When I put MultiSliver in NestedScrollView.headerSliverBuilder with several pinned headers inside, I need to "overscroll" to begin overlapping the body. The problem doesn't occur with one pinned header.

    In the demo, look at the cursor and the shadow beneath the TabBar.

    demo

    The code :

    import 'package:flutter/material.dart';
    import 'package:sliver_tools/sliver_tools.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      static const String _title = 'Flutter Code Sample';
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          title: _title,
          home: MyStatelessWidget(),
        );
      }
    }
    
    class MyStatelessWidget extends StatelessWidget {
      const MyStatelessWidget({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        final List<String> tabs = <String>['Tab 1', 'Tab 2'];
        return DefaultTabController(
          length: tabs.length, // This is the number of tabs.
          child: Scaffold(
            body: NestedScrollView(
              headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
                return <Widget>[
                  SliverOverlapAbsorber(
                    handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
                    sliver: MediaQuery.removePadding(
                      context: context,
                      removeBottom: true,
                      child: MultiSliver(
                        children: [
                          const SliverPinnedHeader(
                              child: SafeArea(child: Padding(padding: EdgeInsets.all(16), child: Text('Test')))),
                          SliverAppBar(
                            title: const Text('Books'), // This is the title in the app bar.
                            pinned: true,
                            expandedHeight: 150.0,
                            forceElevated: innerBoxIsScrolled,
                            bottom: TabBar(
                              tabs: tabs.map((String name) => Tab(text: name)).toList(),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
                ];
              },
              body: TabBarView(
                // These are the contents of the tab views, below the tabs.
                children: tabs.map((String name) {
                  return SafeArea(
                    top: false,
                    bottom: false,
                    child: Builder(
                      builder: (BuildContext context) {
                        return CustomScrollView(
                          key: PageStorageKey<String>(name),
                          slivers: <Widget>[
                            SliverOverlapInjector(
                              // This is the flip side of the SliverOverlapAbsorber
                              // above.
                              handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
                            ),
                            SliverPadding(
                              padding: const EdgeInsets.all(8.0),
                              sliver: SliverFixedExtentList(
                                itemExtent: 48.0,
                                delegate: SliverChildBuilderDelegate(
                                  (BuildContext context, int index) {
                                    return ListTile(
                                      title: Text('Item $index'),
                                    );
                                  },
                                  childCount: 30,
                                ),
                              ),
                            ),
                          ],
                        );
                      },
                    ),
                  );
                }).toList(),
              ),
            ),
          ),
        );
      }
    }
    

    The problem is also on iOS and Web.

    Flutter doctor :

    Doctor summary (to see all details, run flutter doctor -v):
    [✓] Flutter (Channel stable, 3.0.4, on macOS 12.5 21G72 darwin-arm, locale fr-FR)
    [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    [✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
    [✓] Chrome - develop for the web
    [✓] Android Studio (version 2021.2)
    [✓] IntelliJ IDEA Ultimate Edition (version 2022.1.3)
    [✓] VS Code (version 1.70.0)
    [✓] Connected device (3 available)
    [✓] HTTP Host Availability
    

    Thanks for your help.

    opened by manu-sncf 5
  • SliverGeometry has a paintOffset that exceeds the remainingPaintExtent from the constraints.

    SliverGeometry has a paintOffset that exceeds the remainingPaintExtent from the constraints.

    After upgrade to version 0.2.0, this error Came.(version 0.1.10 Works Great)

    This is small repo to reproduce the error. https://github.com/marcos930807/sliver_demo. After open de app just Expand "Batidos/Milkshakes" and see console logs.

    The Complete Error: SliverGeometry has a paintOffset that exceeds the remainingPaintExtent from the constraints. The render object whose geometry violates the constraints is the following: RenderMultiSliver#2d301 relayoutBoundary=up2 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE The remainingPaintExtent is 555.4666669999999, but the paintOrigin + paintExtent is 555.466667.

    Maybe you have fallen prey to floating point rounding errors, and should explicitly apply the min() or max() functions, or the clamp() method, to the paintOrigin + paintExtent?

    The paintOrigin and paintExtent must cause the child sliver to paint within the viewport, and so cannot exceed the remainingPaintExtent.

    opened by marcos930807 5
  • Reason for using child/children instead of sliver/slivers

    Reason for using child/children instead of sliver/slivers

    First, thanks for this amazing package.

    Slivers are a very powerful set of Widgets and this package makes it even more incredible.

    I would like to suggest to rename the params children and child in the sliver widgets of this library to slivers and sliver.

    Inside the Flutter framework, the widgets that only accept slivers use that name convention to indicate a normal widget should not be used. eg SliverSafeArea, SliverPadding, CustomScrollView

    Calling it child and children is confusing and prompt to use normal Widgets and get runtime errors.

    Happy to help with a PR.

    question wontfix 
    opened by jamesblasco 5
  • Is there a way to stop/ignore scroll gestures on pinned SliverPinnedHeader?

    Is there a way to stop/ignore scroll gestures on pinned SliverPinnedHeader?

    When SliverPinnedHeader is pinned, is there a way to prevent any scroll gestures on it? As of now, scroll gestures cause the CustomScrollView to scroll.

    opened by rupinderjeet 4
  • MultiSliver has unexpected behavior when use centerKey in CustomScrollView

    MultiSliver has unexpected behavior when use centerKey in CustomScrollView

    Hi, I try to create a bidirectional lazy load list like the like flutter docs said https://github.com/flutter/flutter/blob/5464c5bac742001448fe4fc0597be939379f88ea/packages/flutter/lib/src/widgets/scroll_view.dart#L502-L513

    I create a gist where you can enable a disable the MultiSliver, and you can see that the scroll behavior is different, is looks like a stack, and also list is iterate in different order.

    On the other hand, maybe do you know other way to create a list that append items to the top of the list by preserving the scroll, the solution that I used is from https://github.com/flutter/flutter/issues/21541#issuecomment-629121578

    I used MultiSliver because my list is grouped and has pinned headers for each group, like this.

    thank you

    bug 
    opened by MiniSuperDev 4
  • Get if header is currently pinned

    Get if header is currently pinned

    Thank you for this package. I have used this to achieve great results with the extended Sliver functionality. But I would love to ask one thing: Is it currently possible to get information on wether the SliverPersistendHeader is currently pinned or not. I would love to know that, because I then can adjust the header depending on whether the list below is currently visible or not.

    And one little bonus I would love to know is if it is possible to expand the list below the header by tapping on the SliverPersistentHeader. If there is no default implementation for this I would use the scroll Controller for this.

    Thanks!

    question 
    opened by felixjaehn 4
  • Multisliver: Local hitTest position on sliver child is calculated wrong.

    Multisliver: Local hitTest position on sliver child is calculated wrong.

    The HitTestResult matrix should be offset by inverse of paint offset, but it's not.

    Test that demonstrates this:

      testWidgets('sliver child hit test position is correct', (tester) async {
          const boxKey = Key('box');
          final controller = ScrollController();
          TapDownDetails? tapDownDetails;
          await tester.pumpWidget(Directionality(
            textDirection: TextDirection.ltr,
            child: CustomScrollView(
              scrollBehavior: NoScrollbarScrollBehaviour(),
              controller: controller,
              physics: const UnconstrainedScollPhysics(),
              slivers: [
                MultiSliver(
                  children: [
                    const SliverToBoxAdapter(child: SizedBox(height: 400)),
                    SliverToBoxAdapter(
                      child: GestureDetector(
                        onTapDown: (details) {
                          tapDownDetails = details;
                        },
                        child: box(boxKey, 'Title', height: 1),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ));
          expect(tapDownDetails, isNull);
          final thebox = find.byKey(boxKey);
          await tester.tap(thebox);
          expect(tapDownDetails?.globalPosition, const Offset(400, 400.5));
          expect(tapDownDetails?.localPosition, const Offset(400, 0.5));
        });
    

    Global position is reported correctly, but local position is not.

    opened by knopp 0
  • Package Performance Hit?

    Package Performance Hit?

    Before I ask my question... the explanation of what I'm trying to achieve...

    • IM BUILDING a custom contact picker

    I have headers for each section A, B, etc...

    I have the ability to scroll to a particular section because I know the height of . the headers . and how many items are in each section (all the contacts are of the same size)

    At the moment I am using a CustomScrollView with a SliverFixedExtentList with a SliverChildBuilderDelegate

    • THE QUESTION Will using this plugin to make my headers sticky affect performance by essentially shrinking wrapping each of my SliverFixedExtentList? will performance be affected any other way? If so, by how much?
    opened by b-cancel 0
  • Is there support for TabBarView?

    Is there support for TabBarView?

    I'm wondering if it's possible to have a view with tabs under which there are scrollable list items and would it work with MultiSliver? In other words a TabBar inside SliverPinnedHeader with below TabBarView so that you can swipe between tabs with gesture and as you scroll up it would push up this SliverPinnedHeader?

    Something similar in behavior to: https://stackoverflow.com/a/64651709

    https://i.stack.imgur.com/TffF6.gif

    That's a question to lib capabilities.

    Best regards

    opened by adamstyrc 0
  • Fixed issue where clipRect is null

    Fixed issue where clipRect is null

    Sometimes (only on the web build) I see a situation where the hitTestChildren function is called before the paint, which causes a nullpointer error on clipRect variable. In this pull request, I added a check for this situation.

    opened by siqwin 0
  • SliverFlexibleHeader proposal

    SliverFlexibleHeader proposal

    This new widget should allows to create a Sliver header that can be pinned or floating based on a parameter without knowing the size of its child.

    Demo:

    https://user-images.githubusercontent.com/87227898/197335468-f2387c7a-c101-473e-9fd2-179f4410118c.mp4

    opened by marcoredz 2
Owner
Pieter van Loon
Pieter van Loon
Aq flutter tools - AQ flutter tools - Responsive Images, Translations and more

Made by AQuadic Getting started Important Links AQuadic Script Requirement This

Aquadic 0 Feb 7, 2022
Dart-ci-tools - A container image with flutter and various CI tools.

dart-ci-tools Container built from the official Dart image, with various CI tools written in Dart. Project Notes There are tools available to: deploy

null 1 Jan 12, 2022
best flutter / dart practices + Custom Painter + Sliver App Bar + Custom Scrollview

Weekly Budget Flutter App A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get yo

Mohamed Awnallah 4 Oct 21, 2021
Arna Framework - A unique set of widgets for building applications with Flutter.

Arna Arna Framework - A unique set of widgets for building applications with Flutter. This Framework is in active development. Any contribution, idea,

Mahan 86 Dec 11, 2022
Get or set persistent storage value based on MMKV framework.

mmkv_flutter Plugin that allow Flutter to read value from persistent storage or save value to persistent storage based on MMKV framework Getting Start

OpenFlutter 101 Jan 17, 2022
Flying Fish is full-stack Dart framework - a semi-opinionated framework for building applications exclusively using Dart and Flutter

Flying Fish is full-stack Dart framework - a semi-opinionated framework for building applications exclusively using Dart and Flutter.

Flutter Fish 3 Dec 27, 2022
Intel Corporation 238 Dec 24, 2022
The ROHD Verification Framework is a hardware verification framework built upon ROHD for building testbenches.

ROHD Verification Framework The ROHD Verification Framework (ROHD-VF) is a verification framework built upon the Rapid Open Hardware Development (ROHD

Intel Corporation 18 Dec 20, 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.

R. Rifa Fauzi Komara 17 Jan 2, 2023
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

pouya 1 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

Flutter 1.3k Dec 29, 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

null 1 Jan 12, 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

Flukit 5 Nov 15, 2022
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

Min Zhao 23 Dec 3, 2022
Various eBay tools for Flutter development

Flutter Glove Box given_when_then golden_toolkit page_object Contains various testing tools that eBay Motors App team is using in their development on

eBay 275 Dec 21, 2022
Raden Saleh 20 Aug 12, 2023
Raden Saleh 53 Jul 27, 2023
PalestineDevelopers is an open-source tools code-base

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

Mohamed Sayed 10 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.

CoCreations 0 Dec 30, 2021