A NestedScrollView that supports outer scroller to top overscroll.

Overview

custom_nested_scroll_view

A NestedScrollView that supports outer scroller to top overscroll.

๐ŸŒ Preview

Web demo ๐Ÿ‘‰ Click Here

๐Ÿ› Problem

NestedScrollView with pinned and stretch SliverAppBar

Problem: NestedScrollView does not support outer scroller to top overscroll, so its SliverAppBar cannot be stretched.

Related issue: https://github.com/flutter/flutter/issues/54059

โšก๏ธ Solution

Fixed by:

  1. Override the applyUserOffset method of _NestedScrollCoordinator to allow over-scroll the top of _outerPosition.

  2. Override the unnestOffset, nestOffset, _getMetrics methods of _NestedScrollCoordinator to fix the mapping between _innerPosition and _outerPosition to _NestedScrollPosition (Coordinator).

For more information, see:

  • example/lib/main.dart
  • lib/src/custom_nested_scroll_view.dart

๐Ÿ’ก Usage

dependencies:  
  ...  
  custom_nested_scroll_view:
    git:
      url: https://github.com/idootop/custom_nested_scroll_view.git
import 'package:flutter/material.dart';
import 'package:custom_nested_scroll_view/custom_nested_scroll_view.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example',
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        body: CustomNestedScrollView(
          physics: BouncingScrollPhysics(),
          overscrollType: CustomOverscroll.outer,
          headerSliverBuilder: (context, outerScrolled) => <Widget>[
            CustomSliverOverlapAbsorber(
              overscrollType: CustomOverscroll.outer,
              handle: CustomNestedScrollView.sliverOverlapAbsorberHandleFor(context),
              sliver: SliverAppBar(
                pinned: true,
                stretch: true,
                expandedHeight: 400,
                flexibleSpace: FlexibleSpaceBar(
                  centerTitle: true,
                  title: Center(child: Text('Example')),
                  background: Image.network(
                    'https://pic1.zhimg.com/80/v2-fc35089cfe6c50f97324c98f963930c9_720w.jpg',
                    fit: BoxFit.cover,
                  ),
                ),
                bottom: TabBar(
                  tabs: [
                    Tab(child: Text('Tab1')),
                    Tab(child: Text('Tab1')),
                  ],
                ),
              ),
            ),
          ],
          body: TabBarView(
            children: [
              CustomScrollView(
                slivers: <Widget>[
                  Builder(
                    builder: (context) => CustomSliverOverlapInjector(
                      overscrollType: CustomOverscroll.outer,
                      handle: CustomNestedScrollView.sliverOverlapAbsorberHandleFor(context),
                    ),
                  ),
                  SliverFixedExtentList(
                    delegate: SliverChildBuilderDelegate(
                      (_, index) => ListTile(
                        key: Key('$index'),
                        title: Center(
                          child: Text('ListTile ${index + 1}'),
                        ),
                      ),
                      childCount: 30,
                    ),
                    itemExtent: 50,
                  ),
                ],
              ),
              Center(
                child: Text('Test'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

โค๏ธ Acknowledgements

Thanks to fluttercandies's extended_nested_scroll_view.

๐Ÿ“– References

Comments
  • Allow access for CustomNestedScrollViewState

    Allow access for CustomNestedScrollViewState

    Hi

    Thank you for the great lib ๐Ÿ‘ I found that this comment is not working. https://github.com/idootop/custom_nested_scroll_view/blob/main/lib/src/nested_scroll_view.dart#L341

    To implement infinite scroll loading I wanted to obtain the inner scrolling state so I wanted to access _NestedScrollViewState.

    What I wanted to do was:

    final GlobalKey<CustomNestedScrollViewState> documentsNestedKey = GlobalKey();
    
    @override
    void initState() {
      WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
        documentsNestedKey.currentState!.innerController.addListener(() {
          print("Scrolling nested scrollview. ${documentsNestedKey.currentState!.innerController.positions}");
          print("Now we can do infinite scroll loading!");
        });
      }
    }
    
    @override
    Widget build(BuildContext context) {
      return CustomNestedScrollView(
        key:  documentsNestedKey,
        ...
      );
    }
    

    Please look into it if you like โœ‹

    opened by smihica 4
  • Layout render exception

    Layout render exception

    Describe the issue:

    When user overscrolls, a layout exception is thrown

    โ•โ•โ•ก EXCEPTION CAUGHT BY RENDERING LIBRARY โ•žโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
    The following assertion was thrown during performLayout():
    SliverGeometry is not valid: The "scrollExtent" is negative.
    The RenderSliver that returned the offending geometry was: _RenderSliverOverlapAbsorberX#c28e4 relayoutBoundary=up1 NEEDS-PAINT:
      needs compositing
      creator: CustomSliverOverlapAbsorber โ† _ProfileSliverAppBar โ† BlocListener<AuthWatcherCubit,
        AuthWatcherState> โ† BlocSelector<AuthWatcherCubit, AuthWatcherState, User?> โ†
        _NestedScrollViewViewport โ† IgnorePointer-[GlobalKey#eb7c8] โ† Semantics โ† Listener โ†
        _GestureSemantics โ† RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#e565b] โ†
        Listener โ† _ScrollableScope โ† โ‹ฏ
      parentData: paintOffset=Offset(0.0, 0.0) (can use size)
      constraints: SliverConstraints(AxisDirection.down, GrowthDirection.forward, ScrollDirection.forward,
        scrollOffset: 0.0, remainingPaintExtent: 748.0, overlap: -148.0, crossAxisExtent: 414.0,
        crossAxisDirection: AxisDirection.right, viewportMainAxisExtent: 896.0, remainingCacheExtent:
        998.0, cacheOrigin: 0.0)
      geometry: SliverGeometry(scrollExtent: -0.0, paintExtent: 296.0, paintOrigin: -148.0, layoutExtent:
        148.0, maxPaintExtent: 296.0, hasVisualOverflow: true, cacheExtent: 148.0)
      handle: _SliverOverlapAbsorberHandle(0.0null)
    
    The relevant error-causing widget was:
      CustomSliverOverlapAbsorber
      CustomSliverOverlapAbsorber:file:///Users/brendan/Mobile/FlutterProjects/sorosoke/lib/features/dashboard/presentation/screens/profile_sc
      reen.dart:125:12
    
    When the exception was thrown, this was the stack:
    #0      SliverGeometry.debugAssertIsValid.<anonymous closure>.verify (package:flutter/src/rendering/sliver.dart:712:9)
    #1      SliverGeometry.debugAssertIsValid.<anonymous closure> (package:flutter/src/rendering/sliver.dart:721:7)
    #2      SliverGeometry.debugAssertIsValid (package:flutter/src/rendering/sliver.dart:751:6)
    #3      RenderSliver.debugAssertDoesMeetConstraints (package:flutter/src/rendering/sliver.dart:1205:22)
    #4      RenderObject.layout.<anonymous closure> (package:flutter/src/rendering/object.dart:2138:9)
    #5      RenderObject.layout (package:flutter/src/rendering/object.dart:2140:8)
    #6      RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:516:13)
    #7      RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1600:12)
    #8      RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1507:20)
    #9      RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1973:7)
    #10     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:999:18)
    #11     RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:513:19)
    #12     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:884:13)
    #13     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:378:5)
    #14     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1175:15)
    #15     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1104:9)
    #16     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1015:5)
    #20     _invoke (dart:ui/hooks.dart:150:10)
    #21     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:318:5)
    #22     _drawFrame (dart:ui/hooks.dart:115:31)
    (elided 3 frames from dart:async)
    
    The following RenderObject was being processed when the exception was fired: _RenderSliverOverlapAbsorberX#c28e4 relayoutBoundary=up1
    NEEDS-PAINT:
      needs compositing
      creator: CustomSliverOverlapAbsorber โ† _ProfileSliverAppBar โ† BlocListener<AuthWatcherCubit,
        AuthWatcherState> โ† BlocSelector<AuthWatcherCubit, AuthWatcherState, User?> โ†
        _NestedScrollViewViewport โ† IgnorePointer-[GlobalKey#eb7c8] โ† Semantics โ† Listener โ†
        _GestureSemantics โ† RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#e565b] โ†
        Listener โ† _ScrollableScope โ† โ‹ฏ
      parentData: paintOffset=Offset(0.0, 0.0) (can use size)
      constraints: SliverConstraints(AxisDirection.down, GrowthDirection.forward, ScrollDirection.forward,
        scrollOffset: 0.0, remainingPaintExtent: 746.7, overlap: -149.3, crossAxisExtent: 414.0,
        crossAxisDirection: AxisDirection.right, viewportMainAxisExtent: 896.0, remainingCacheExtent:
        996.7, cacheOrigin: 0.0)
      geometry: SliverGeometry(scrollExtent: -1.3, paintExtent: 297.3, paintOrigin: -149.3, layoutExtent:
        148.0, maxPaintExtent: 297.3, hasVisualOverflow: true, cacheExtent: 148.0)
      handle: _SliverOverlapAbsorberHandle(0.0null)
    This RenderObject had the following descendants (showing up to depth 5):
        child: _RenderSliverPinnedPersistentHeaderForWidgets#10042 relayoutBoundary=up2 NEEDS-PAINT
          child: RenderSemanticsAnnotations#f31e0 relayoutBoundary=up3 NEEDS-PAINT
            child: RenderAnnotatedRegion<SystemUiOverlayStyle>#434e1 relayoutBoundary=up4 NEEDS-PAINT
              child: RenderPhysicalModel#bf5d5 relayoutBoundary=up5 NEEDS-PAINT
                child: _RenderInkFeatures#eba97 relayoutBoundary=up6 NEEDS-PAINT
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    
    Another exception was thrown: SliverGeometry is not valid: The "scrollExtent" is negative.
    

    Steps to Reproduce:

    Use the default example in the Readme.md

    • Change minHeight to 100
    • Change maxHeight to 120
    • Pull down the ScrollView past 120 (maxHeight)
    • Platform - iOS
    class Home extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: DefaultTabController(
            length: 2,
            child: CustomNestedScrollView(
              overscrollType: CustomOverscroll.outer,
              // !important
              physics: const BouncingScrollPhysics(
                parent: AlwaysScrollableScrollPhysics(),
              ),
              headerSliverBuilder: (context, innerScrolled) => <Widget>[
                MySliverAppBar(),
              ],
              body: TabBarView(
                children: [
                  CustomScrollView(
                    // !important
                    physics: const BouncingScrollPhysics(
                      parent: AlwaysScrollableScrollPhysics(),
                    ),
                    slivers: <Widget>[
                      TopOverlapInjector(),
                      // scroll view
                      SliverFixedExtentList(
                        delegate: SliverChildBuilderDelegate(
                          (_, index) => ListTile(
                            key: Key('$index'),
                            title: Center(
                              child: Text('ListTile ${index + 1}'),
                            ),
                          ),
                          childCount: 30,
                        ),
                        itemExtent: 50,
                      ),
                    ],
                  ),
                  CustomScrollView(
                    physics: NeverScrollableScrollPhysics(),
                    slivers: <Widget>[
                      TopOverlapInjector(),
                      // some widget
                      SliverFillRemaining(
                        child: Center(
                          child: Text('Test'),
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    
    class TopOverlapInjector extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Builder(
          builder: (context) => CustomSliverOverlapInjector(
            overscrollType: CustomOverscroll.outer,
            handle: CustomNestedScrollView.sliverOverlapAbsorberHandleFor(context),
          ),
        );
      }
    }
    
    class MySliverAppBar extends StatelessWidget {
      ///Header collapsed height
      final minHeight = 100.0;
    
      ///Header expanded height
      final maxHeight = 120.0;
    
      final tabBar = TabBar(
        tabs: <Widget>[Text('Tab1'), Text('Tab2')],
      );
    
      @override
      Widget build(BuildContext context) {
        final topHeight = MediaQuery.of(context).padding.top;
        return CustomSliverOverlapAbsorber(
          overscrollType: CustomOverscroll.outer,
          handle: CustomNestedScrollView.sliverOverlapAbsorberHandleFor(
            context,
          ),
          sliver: SliverAppBar(
            pinned: true,
            stretch: true,
            toolbarHeight: minHeight - tabBar.preferredSize.height - topHeight,
            collapsedHeight: minHeight - tabBar.preferredSize.height - topHeight,
            expandedHeight: maxHeight - topHeight,
            flexibleSpace: FlexibleSpaceBar(
              centerTitle: true,
              title: Center(child: Text('Example')),
              stretchModes: <StretchMode>[
                StretchMode.zoomBackground,
                StretchMode.blurBackground,
              ],
              background: Image.network(
                'https://pic1.zhimg.com/80/v2-fc35089cfe6c50f97324c98f963930c9_720w.jpg',
                fit: BoxFit.cover,
              ),
            ),
            bottom: tabBar,
          ),
        );
      }
    }
    
    opened by definitelyme 3
  • breaking changes in flutter 3.4

    breaking changes in flutter 3.4

    There are some breaking changes in the API of flutter 3.4:

    1. ScrollActivityDelegate has a new method updateBallisticAnimation which must be implemented
    2. BallisticScrollActivity has a new parameter in its constructor: shouldIgnorePointer

    Has someone already looked into this?

    opened by Klabauterman 3
  • Incompatibility of plugin with Flutter 3.7.0-13.0.pre.79 leads to build failure

    Incompatibility of plugin with Flutter 3.7.0-13.0.pre.79 leads to build failure

    I'm using Flutter master branch, and I just pulled the lastest update and try starting my app, however I got an error from this plugin file.

    My Flutter and Dart version info is below:

    Flutter 3.7.0-13.0.pre.79 โ€ข channel master โ€ข https://github.com/flutter/flutter.git
    Framework โ€ข revision 91c3f80c8c (15 hours ago) โ€ข 2022-12-27 04:44:24 -0500
    Engine โ€ข revision 790604a09f
    Tools โ€ข Dart 3.0.0 (build 3.0.0-64.0.dev) โ€ข DevTools 2.20.0
    

    And in this version of Flutter, after I tried to start my app, I got this error (I tried flutter clean and pub get however the problem still there):

    Launching lib\main.dart on sdk gphone64 x86 64 in debug mode...
    lib\main.dart:1
    : Error: The method '_NestedScrollMetrics.copyWith' doesn't have the named parameter 'devicePixelRatio' of overridden method 'Object with ScrollMetrics.copyWith'.
    ../โ€ฆ/src/nested_scroll_view.dart:526
      _NestedScrollMetrics copyWith({
                           ^
    /C:/flutter/packages/flutter/lib/src/widgets/scroll_metrics.dart:43:17: Context: This is the overridden method ('copyWith').
      ScrollMetrics copyWith({
                    ^
    
    : Error: The superclass, 'FixedScrollMetrics', has no unnamed constructor that takes no arguments.
    ../โ€ฆ/src/nested_scroll_view.dart:514
      _NestedScrollMetrics({
      ^^^^^^^^^^^^^^^^^^^^
    Target kernel_snapshot failed: Exception
    2
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Script 'C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1157
    
    * What went wrong:
    Execution failed for task ':app:compileFlutterBuildDebug'.
    > Process 'command 'C:\flutter\bin\flutter.bat'' finished with non-zero exit value 1
    
    * Try:
    > Run with --stacktrace option to get the stack trace.
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 16s
    Exception: Gradle task assembleDebug failed with exit code 1
    Exited (sigterm)
    
    opened by nfnfgo 2
  • Flutter 3.0.0 | Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.

    Flutter 3.0.0 | Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.

    : Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.

    • 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('../../fvm/versions/3.0.0/packages/flutter/lib/src/scheduler/binding.dart'). SchedulerBinding.instance!.addPostFrameCallback( ^ Restarted application in 3,635ms. flutter: ^[[38;5;12mโ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€<โ€ฆ> flutter: ^[[38;5;12mโ”‚ #0 AuthGuard.onNavigation (package:fullpass/routes/auth_guard.dart:15:14)<โ€ฆ> flutter: ^[[38;5;12mโ”‚ #1 StackRouter._canNavigate (package:auto_route/src/router/controller/routing_controller.dart:1093:13)<โ€ฆ> flutter: ^[[38;5;12mโ”œโ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„<โ€ฆ> flutter: ^[[38;5;12mโ”‚ ๐Ÿ’ก AuthAuthorizedState()<โ€ฆ> flutter: ^[[38;5;12mโ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€<โ€ฆ>
    opened by Solano-Furlan 1
Owner
Life is short, make it sweet.
null
An abstraction on top of flutter camera.

An abstraction on top of flutter camera. Features Provides the lower level handling of the camera plugin Handles all camera resources Handle camera st

Mateus Felipe C. C. Pinto 25 May 3, 2022
A Flutter plugin to read ๐Ÿ”– metadata of ๐ŸŽต media files. Supports Windows, Linux & Android.

flutter_media_metadata A Flutter plugin to read metadata of media files. A part of Harmonoid open source project ?? Install Add in your pubspec.yaml.

Harmonoid 60 Dec 2, 2022
A Flutter plugin that supports Pangle SDK on Android and iOS.

Thanks for non-commercial open source development authorization by JetBrains. ็ฉฟๅฑฑ็”ฒ Flutter SDK `pangle_flutter`ๆ˜ฏไธ€ๆฌพ้›†ๆˆไบ†ๅญ—่Š‚่ทณๅŠจ็ฉฟๅฑฑ็”ฒ Android ๅ’Œ iOS SDK็š„ Flutter

null 121 Dec 2, 2022
OOTP (Open One-time Password) is a supports multiple programming languages.

OOTP (Open One-time Password) is a supports multiple programming languages. The generated one-time passwords are fully compliant with HOTP (HMAC-based One-time Password) and TOTP (Time-based One-time Password).

Odroe 16 Nov 20, 2022
A better Minecraft Launcher that supports multiple platforms and many functionalities for you to explore!

A better Minecraft Launcher that supports multiple platforms and many functionalities for you to explore!

RPMTW Team 74 Dec 14, 2022
A Flutter plugin for handling Connectivity and REAL Connection state in the mobile, web and desktop platforms. Supports iOS, Android, Web, Windows, Linux and macOS.

cross_connectivity A Flutter plugin for handling Connectivity and REAL Connection state in the mobile, web and desktop platforms. Supports iOS, Androi

MarchDev Toolkit 29 Nov 15, 2022
Generate a new file by compressed video, and provide metadata. Get video thumbnail from a video path, supports JPEG/GIF. To reduce app size not using FFmpeg in IOS.

flutter_video_compress Generate a new path by compressed video, Choose to keep the source video or delete it by a parameter. Get video thumbnail from

ๅคฉๆตทใ‚‹ใ‚Š 179 Dec 8, 2022
A robust Flutter plugin for making payments via Paystack Payment Gateway. Completely supports Android and iOS

?? Paystack Plugin for Flutter A Flutter plugin for making payments via Paystack Payment Gateway. Fully supports Android and iOS. ?? Installation To u

Wilberforce Uwadiegwu 165 Jan 4, 2023
A flutter plugin for integrating razorpay payment gateway. Supports Android and iOS.

Flutter Razorpay Plugin A flutter plugin for razorpay integration for both android and ios. If you use this library in your app, please let me know an

Chetan Kaushik 28 Dec 13, 2022
A chatting app made with Flutter and FireBase. It supports GIPHY gifs, images, stcikers, dark mode, custom animations, google login, online storage, beautiful UI and more.

ChatMe A Flutter based chatting app which lets user chat from random peoples or strangers, has GIPHY gif support, sitckers, custom animations, dark mo

Hash Studios 20 Nov 7, 2022
Slibro is a full-fledged story writing and publishing platform that supports short and long format stories

Slibro is a full-fledged story writing and publishing platform that supports short and long format stories. Flutter, Appwrite, and Rapyd is use

Souvik Biswas 7 Dec 8, 2022
A nested TabBarView overscroll unites outer TabBarView scroll event

union_tabs A nested TabBarView overscroll event unites outer TabBarView scroll event Getting Started 1.Install dependencies: union_tabs: ^1.0.0+7 2.

wilin 20 Sep 7, 2022
Flutter package to create a day date scroller

scrolling_day_calendar A flutter calendar package to allow users to scroll through given dates either by swiping left and right or pressing the arrows

null 8 Jul 12, 2020
A new Flutter package support scroll to index for Listview, Gridview and NestedScrollView

easy_scroll_to_index A new Flutter package support scroll to index for Listview, Gridview and NestedScrollView Author: DinhVanHung Demo Example: Displ

Dinh Hung 4 Nov 19, 2021
NestedScrollView: extended nested scroll view to fix following issues.

NestedScrollView: extended nested scroll view to fix following issues.

FlutterCandies 457 Jan 4, 2023
A powerful official extension library of Tab/TabBar/TabView, which support to scroll ancestor or child Tabs when current is overscroll, and set scroll direction and cache extent.

extended_tabs Language: English | ไธญๆ–‡็ฎ€ไฝ“ A powerful official extension library of Tab/TabBar/TabView, which support to scroll ancestor or child Tabs whe

FlutterCandies 185 Dec 13, 2022
A Flutter widget for Scrollview, pop when overscroll

overscroll_pop A Flutter widget for Scrollview, pop when overscroll like Instagram, Pinterest, ... Getting Started Include the package to your project

null 22 Dec 21, 2022
A simple wrapper on top of Google Play Games Services (GPGS), including auth, achievement, and more.

play_games Use Google Play Games Services on your Flutter app; this allows for signin and achievements so far, but more additions are very welcome. If

Flame Engine 59 Sep 10, 2022
A wrapper to show a scroll to top prompt to the user on scrollable widgets.

flutter_scroll_to_top A wrapper to show a scroll to top prompt to the user on scrollable widgets. Installing Add the following dependency to your pubs

Naman Shergill 11 May 16, 2022
top-snackbar-flutter - Modern UI snackbar widget

top-snackbar-flutter - Modern UI snackbar widget

null 110 Jan 7, 2023