NestedScrollView: extended nested scroll view to fix following issues.

Overview

extended_nested_scroll_view

pub package GitHub stars GitHub forks GitHub license GitHub issues flutter-candies

Language: English | 中文简体

NestedScrollView: extended nested scroll view to fix following issues.

1.pinned sliver header issue

2.inner scrollables in tabview sync issue

3.do without ScrollController in NestedScrollView's body

Web demo for ExtendedNestedScrollView

Example for issue 1

give total height of pinned sliver headers in pinnedHeaderSliverHeightBuilder callback

 var tabBarHeight = primaryTabBar.preferredSize.height;
      var pinnedHeaderHeight =
          //statusBar height
          statusBarHeight +
              //pinned SliverAppBar height in header
              kToolbarHeight;

    ExtendedNestedScrollView(
        pinnedHeaderSliverHeightBuilder: () {
          return pinnedHeaderHeight;
        }
       )   ,
       

Example for issue 2

    ExtendedNestedScrollView(
       onlyOneScrollInBody: true,
    )

Do without ScrollController in NestedScrollView's body

  • due to we can't set ScrollController for list in NestedScrollView's body(it will breaking behaviours of InnerScrollController in NestedScrollView),provide Demos

  • pull to refresh

  • load more

  • scroll to top

    show how to do it without ScrollController

  • pinned header height

    show how to change pinned header height dynamically.

Comments
  • Tabs sync issue is not solved in versions 4.0 and 5.0

    Tabs sync issue is not solved in versions 4.0 and 5.0

    Hey, In versions before 4.0, the sync issue was fixed, but with the refractor in 4.0 something is not working there. I set onlyOneScrollInBody to true but the tabs still scrolls together sometimes. Even in the simple example in the demo website, you will find the sync bug there. Please help, Thanks.

    help wanted 
    opened by naamapps 23
  • 4.0.0版本的更新存在bug,3.0.1版本正常

    4.0.0版本的更新存在bug,3.0.1版本正常

    重现方式: ExtendedNestedScrollView + SliverAppBar + Tab(2Item)+ PageView(2Item) PageView的children是2个GridView 下面的步骤都是通过滑动PageView来切换,通过Tab切换重现bug概率很低 第一步:不要滑动GridView1,直接PageView左滑切换到GridView2,然后再PageView右滑切换回GridView1 第二步:往上滑动GridView1一些距离,然后PageView左滑切换到GridView2,然后再PageView右滑切换回GridView1 第三步:往上滑动GridView1一些距离,然后再PageView左滑切换到GridView2,这时GridView2位置发生了变化,这应该是个bug 注意:重现的时候,GridView1滑动的距离可以少一点或者多一点多测几次,有时不一定能重现,但是多试几次肯定能重现bug

    opened by hylsabella 13
  • 当tab前面的内容超过一屏,或者说超过一屏更多,下面的内容在没有吸顶的情况下,listview跟着滑动

    当tab前面的内容超过一屏,或者说超过一屏更多,下面的内容在没有吸顶的情况下,listview跟着滑动

    测试大佬的demo,也会出现类同的情况,希望大佬能指点一下,。情况台下, body: extended.NestedScrollView( headerSliverBuilder: (context, f) { return [ ExtendedSliverAppbar( title: IndexTitle(), leading: Container(), isOpacityFadeWithTitle: false, isOpacityFadeWithToolbar: false, background: IndexBackgroud(), ), SliverPersistentHeader( delegate: BaseSliverPersistentHeader( child: buidTabBar(), maxHeight: 50, minHeight: 50, ), pinned: true, ), ]; }, pinnedHeaderSliverHeightBuilder: () { return pinnedHeaderHeight; }, body: TabBarView( controller: homeController.tabController, children: homeController.pageList, ), ), );

    opened by cqkyis 7
  • The non-abstract class '_NestedScrollPosition' is missing implementations for these members:  - ScrollPosition.pointerScroll

    The non-abstract class '_NestedScrollPosition' is missing implementations for these members: - ScrollPosition.pointerScroll

    On Flutter 2.0, I get this error when trying to build the app. I use version 2.0.1 of this package - the latest version.

    ../../../../flutter/.pub-cache/hosted/pub.dartlang.org/extended_nested_scroll_view-2.0.1/lib/src/old_extended_nested_scroll_view.dart:1229:7: Error: The non-abstract class '_NestedScrollPosition' is missing implementations for these members:
     - ScrollPosition.pointerScroll                                         
    Try to either                                                           
     - provide an implementation,                                           
     - inherit an implementation from a superclass or mixin,                
     - mark the class as abstract, or                                       
     - provide a 'noSuchMethod' implementation.                             
                                                                            
    class _NestedScrollPosition extends ScrollPosition                      
          ^^^^^^^^^^^^^^^^^^^^^                                             
    ../../../../flutter/packages/flutter/lib/src/widgets/scroll_position.dart:777:8: Context: 'ScrollPosition.pointerScroll' is defined here.
      void pointerScroll(double delta);           
    

    Please help, Thanks

    opened by naamapps 7
  • 似乎并没有解决 issue 2 滚动问题

    似乎并没有解决 issue 2 滚动问题

    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
      final List<String> _tabs = [
        "AAA",
        "BBB",
        "CCC",
        "DDD",
        "EEE",
        "FFF",
      ];
    
      TabController tcl;
    
      @override
      void initState() {
        super.initState();
        tcl = TabController(length: _tabs.length, vsync: this);
      }
    
      @override
      void dispose() {
        tcl.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        final double statusBarHeight = MediaQuery.of(context).padding.top;
        final double pinnedHeaderHeight = statusBarHeight + kToolbarHeight;
    
        return extended.NestedScrollView(
          pinnedHeaderSliverHeightBuilder: () {
            return pinnedHeaderHeight;
          },
          innerScrollPositionKeyBuilder: () => Key('${_tabs[tcl.index]}'),
            headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
              // These are the slivers that show up in the "outer" scroll view.
              return <Widget>[
    //            SliverOverlapAbsorber(
                  // This widget takes the overlapping behavior of the SliverAppBar,
                  // and redirects it to the SliverOverlapInjector below. If it is
                  // missing, then it is possible for the nested "inner" scroll view
                  // below to end up under the SliverAppBar even when the inner
                  // scroll view thinks it has not been scrolled.
                  // This is not necessary if the "headerSliverBuilder" only builds
                  // widgets that do not overlap the next sliver.
    //              handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
    //              sliver:
              SliverAppBar(
                    title: const Text('Books'), // This is the title in the app bar.
                    pinned: true,
                    floating: true,
                    snap: true,
                    // The "forceElevated" property causes the SliverAppBar to show
                    // a shadow. The "innerBoxIsScrolled" parameter is true when the
                    // inner scroll view is scrolled beyond its "zero" point, i.e.
                    // when it appears to be scrolled below the SliverAppBar.
                    // Without this, there are cases where the shadow would appear
                    // or not appear inappropriately, because the SliverAppBar is
                    // not actually aware of the precise position of the inner
                    // scroll views.
                    forceElevated: innerBoxIsScrolled,
                    bottom: TabBar(
                      controller: tcl,
                      isScrollable: true,
                      // These are the widgets to put in each tab in the tab bar.
                      tabs: _tabs.map((String name) => Tab(text: name)).toList(),
                    ),
                  ),
    //            ),
              ];
            },
            body: TabBarView(
              controller: tcl,
              // These are the contents of the tab views, below the tabs.
              children: _tabs.map((String name) {
                return SafeArea(
                  top: false,
                  bottom: false,
                  child: Builder(
                    // This Builder is needed to provide a BuildContext that is
                    // "inside" the NestedScrollView, so that
                    // sliverOverlapAbsorberHandleFor() can find the
                    // NestedScrollView.
                    builder: (BuildContext context) {
                      return RefreshIndicator(child: CustomScrollView(
                        // The "controller" and "primary" members should be left
                        // unset, so that the NestedScrollView can control this
                        // inner scroll view.
                        // If the "controller" property is set, then this scroll
                        // view will not be associated with the NestedScrollView.
                        // The PageStorageKey should be unique to this ScrollView;
                        // it allows the list to remember its scroll position when
                        // the tab view is not on the screen.
                        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(0),
                            // In this example, the inner scroll view has
                            // fixed-height list items, hence the use of
                            // SliverFixedExtentList. However, one could use any
                            // sliver widget here, e.g. SliverList or SliverGrid.
                            sliver: TabPage(key: Key(name)),
                          ),
                        ],
                      ), onRefresh: () => Future.delayed(Duration(seconds: 5)));
                    },
                  ),
                );
              }).toList(),
            ),
          );
      }
    }
    
    class TabPage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _TabPageState();
      }
    
      TabPage({Key key}) : super(key: key);
    }
    
    class _TabPageState extends State<TabPage> with AutomaticKeepAliveClientMixin {
      @override
      bool get wantKeepAlive => true;
    
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return extended.NestedScrollViewInnerScrollPositionKeyWidget(
            widget.key,
            SliverFixedExtentList(
              // The items in this example are fixed to 48 pixels
              // high. This matches the Material Design spec for
              // ListTile widgets.
              itemExtent: 48.0,
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  // This builder is called for each child.
                  // In this example, we just number each list item.
                  return Material(
                      child: ListTile(
                    title: Text('Item $index'),
                  ));
                },
                // The childCount of the SliverChildBuilderDelegate
                // specifies how many children this inner list
                // has. In this example, each tab has a list of
                // exactly 30 items, but this is arbitrary.
                childCount: 30,
              ),
            ));
      }
    }
    opened by huajianjiang 6
  • Bump visibility_detector dependency version

    Bump visibility_detector dependency version

    Hi! Currently we're getting several warnings due to this package not using the latest visibility_detector version which has upgraded their linting for flutter v3.

    Example of warning:

    ./../../.pub-cache/hosted/pub.dartlang.org/visibility_detector-0.2.2/lib/src/visibility_detector_layer.dart:126:28: Warning: Operand of null-aware operation '?.' has type 'RendererBinding' which excludes null.
    

    Is it possible to bump this dependency version? I'm open for putting up a PR if needed!

    opened by adigladi 5
  • 在BottomNavigationBar的PageView上使用,ExtendedNestedScrollView的body中TabBarView的不满屏的情况下,无法顺畅滑动

    在BottomNavigationBar的PageView上使用,ExtendedNestedScrollView的body中TabBarView的不满屏的情况下,无法顺畅滑动

    使用底部导航栏BottomNavigationBar,在其PageView中使用ExtendedNestedScrollView(), 其中headerSliverBuilder中使用了固定的SliverAppBar,TabBar,和中间的使用SliverToBoxAdapter展示的信息。 在body中使用的普通的滚动布局,如GridView

    然后在GridView中内容较少,或无的情况下,向上滑动折叠不连贯,不顺畅,需要两次拖拽才能滑至最顶处,中间的卡住时,向上向下都无法继续滑动,得松手重新触摸。 经对比,官方的滑动不会卡住。在页面中直接使用也不会有这问题。GridView的内容超过一屏左右也不会有问题。 希望能有解决的方法

    BottomNavigationBar 为正常的使用方式:

       return Scaffold(
          body: PageView.builder(
            itemBuilder: (context, index) => pages[index],
            controller: pageController,
            physics: NeverScrollableScrollPhysics(),
          ),
          bottomNavigationBar: BottomNavigationBar(
            type: BottomNavigationBarType.fixed,
            selectedItemColor: Colors.black,
            unselectedItemColor: Colors.grey,
            selectedFontSize: 10.0,
            unselectedFontSize: 10.0,
            items: <BottomNavigationBarItem>[
              BottomNavigationBarItem(
                icon: Icon(Icons.home_rounded),
                activeIcon: Icon(Icons.home_rounded),
                label: "Home",
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.people),
                activeIcon: Icon(Icons.people),
                label: "account",
              ),
            ],
            currentIndex: _selectedIndex,
            onTap: _onItemTapped,
          ),
        );
    

    ExtendedNestedScrollView:

    class TestExtendedNestedScrollView extends StatefulWidget {
      const TestExtendedNestedScrollView({Key? key}) : super(key: key);
    
      @override
      _TestExtendedNestedScrollViewState createState() => _TestExtendedNestedScrollViewState();
    }
    
    class _TestExtendedNestedScrollViewState extends State<TestExtendedNestedScrollView> {
    
      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: GlowNotificationWidget(
              ExtendedNestedScrollView(
                onlyOneScrollInBody: true,
                pinnedHeaderSliverHeightBuilder: () {
                  double statusBarHeight =
                      MediaQueryData.fromWindow(window).padding.top;
                  return appBarHeight + 50 + statusBarHeight;
                },
                headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
                  // These are the slivers that show up in the "outer" scroll view.
                  return <Widget>[
    
                    SliverAppBar(
                      title: Text("Test"),
                      automaticallyImplyLeading: false,
                      expandedHeight: 200,
                      pinned: true,
                    ),
    
                    SliverToBoxAdapter(
                      child: Column(
                        children: [
                          ListTile(
                            title: Text('Order'),
                          ),
                          ListTile(
                            title: Text('Order'),
                          ),
                          ListTile(
                            title: Text('Order'),
                          ),
                          ListTile(
                            title: Text('Order'),
                          ),
                        ],
                      ),
                    ),
    
                    SliverPersistentHeader(
                      pinned: true,
                      delegate: NRSliverHeaderDelegate(
                        backgroundColor: Colors.white,
                        islucency: false,
                        child: PreferredSize(
                          preferredSize: Size(double.maxFinite, 50),
                          child: TabBar(
                            padding: EdgeInsets.zero,
                            tabs: [
                              Tab(
                                text: "Test",
                              ),
                              Tab(
                                text: "Tessssssssst",
                              )
                            ],
                            isScrollable: true,
                            indicatorColor: Colors.black,
                            indicatorSize: TabBarIndicatorSize.tab,
                            labelColor: Colors.black,
                            labelStyle: TextStyle(
                              fontSize: 16,
                              fontWeight: FontWeight.w600,
                              color: Colors.black,
                            ),
                            unselectedLabelColor: Colors.grey[100],
                            labelPadding: EdgeInsets.only(left: 20, right: 15),
                            onTap: (index) {
    
                            },
                          ),
                        ),
                      ),
                    ),
                  ];
                },
                body: TabBarView(
                  // These are the contents of the tab views, below the tabs.
                  children: [
                    TestTabOne(),
                    TestTabTwo(),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }
    
    class NRSliverHeaderDelegate extends SliverPersistentHeaderDelegate {
      PreferredSize child; //传入preferredsize组件,因为此组件需要固定高度
      bool islucency; //入参 是否更加滑动变化透明度,true,false
      Color backgroundColor; //需要设置的背景色
      NRSliverHeaderDelegate(
          {required this.islucency,
            required this.child,
            required this.backgroundColor});
    
      @override
      Widget build(
          BuildContext context, double shrinkOffset, bool overlapsContent) {
        double mainHeight = maxExtent - shrinkOffset; //动态获取滑动剩余高度
        return Column(
          children: [
            Container(
              height: 49,
              width: MediaQuery.of(context).size.width,
              color: backgroundColor,
              child: Opacity(
                  opacity: islucency == true && mainHeight != maxExtent
                      ? ((mainHeight / maxExtent) * 0.5).clamp(0, 1)
                      : 1, //根据滑动高度隐藏显示
                  child: child),
            ),
            Divider(
              height: 1,
              color: Colors.grey[200],
            )
          ],
        );
      }
    
      @override
      double get maxExtent => this.child.preferredSize.height;
    
      @override
      double get minExtent => this.child.preferredSize.height;
    
      @override
      bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
        return false;
      }
    }
    

    GridView:

    class TestTabTwo extends StatefulWidget {
      const TestTabTwo({Key? key}) : super(key: key);
    
      @override
      _TestTabTwoState createState() => _TestTabTwoState();
    }
    
    class _TestTabTwoState extends State<TestTabTwo> with AutomaticKeepAliveClientMixin {
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            mainAxisSpacing: 15,
            crossAxisSpacing: 15,
            childAspectRatio: 0.5,
          ),
          itemCount: 0,
          itemBuilder: (context, index) {
            return Container(
              color: Colors.green,
              width: double.maxFinite,
              height: double.maxFinite,
            );
          },
        );
      }
    
      @override
      bool get wantKeepAlive => true;
    }
    
    opened by EchoPuda 5
  • [BUG & REQUEST] PullToRefresh for Outer Scroller, Allow over scrolling

    [BUG & REQUEST] PullToRefresh for Outer Scroller, Allow over scrolling

    Hi, thank you for building this package.

    I want to use your pull_to_refresh package with extended_nested_scroll_view.

    The problem is your method does that the overscroll and indicator happen on the inner scrollers below the tabs.

    However, I have to do it on the outer scroller. (top of the scroller).

    Please have a look at the below image. The overscroll physics is done on the outer scroller. Not on the inner scrollers of the tabs. So the refresh indicator can be placed on top of the page where the overscroll happens. Not in between the tab button area and inner scroller.

    I even tried doing some tricky solutions and created an algorithm with NotificationListener (and using notification types). It almost works while overscrolling; however, it doesn't when moving in the opposite direction of the overscroll direction. In other words, the OverscrollNotification works as expected when dragging down but not when dragging up.

    Instagram Profile Screen - This is what I want since it provides the best UX.

    instagram-overscroll

    This is the current package, from your examples

    currently

    StackOverflow 
    opened by yasinarik 5
  • 滚动NestedScrollView 的 body 下的Column 会报高度溢出 A RenderFlex overflowed by 40 pixels on the bottom.

    滚动NestedScrollView 的 body 下的Column 会报高度溢出 A RenderFlex overflowed by 40 pixels on the bottom.

    您好!

    headerSliverBuilder 高度 超过 一屏的时候

    extened_nested_scroll_view_demo 这个示例中 滚动NestedScrollView 的 body 下的Column 会报高度溢出 A RenderFlex overflowed by 40 pixels on the bottom.

    这个问题麻烦看看,谢谢

    opened by purestart 5
  • Update documentation on the 2.0.0 breaking changes

    Update documentation on the 2.0.0 breaking changes

    I noticed that the library was upgraded to 2.0.0 version a couple of days ago. This update introducing 2 breaking changes but I can't find any information about them. Can you update it in the document?

    opened by khanhnguyen-96 5
  • 向上拉动态更新数据之后再向下滑动列表过程中报这个异常,但是程序没有奔溃,不知道是怎么回事

    向上拉动态更新数据之后再向下滑动列表过程中报这个异常,但是程序没有奔溃,不知道是怎么回事

    Another exception was thrown: 'package:extended_nested_scroll_view/src/old_extended_nested_scroll_view.dart': Failed assertion: line 1640 pos 9: 'result': is not true.

    opened by guchengxi1994 4
  • 编译报错

    编译报错

    /C:/Users/zwhl/AppData/Local/Pub/Cache/hosted/pub.flutter-io.cn/extended_nested_scroll_view-5.1.3/lib/src/extended_nested_scroll_view.dart:1398:7: Error: The non-abstract class '_NestedScrollPosition' is missing implementations for these members:

    • ScrollActivityDelegate.updateBallisticAnimation Try to either
    • provide an implementation,
    • inherit an implementation from a superclass or mixin,
    • mark the class as abstract, or
    • provide a 'noSuchMethod' implementation.

    class _NestedScrollPosition extends ScrollPosition ^^^^^^^^^^^^^^^^^^^^^ /D:/Program%20Files/flutter_windows_2.9.0-0.1.pre-dev/flutter/packages/flutter/lib/src/widgets/scroll_activity.dart:59:15: Context: 'ScrollActivityDelegate.updateBallisticAnimation' is defined here. Simulation? updateBallisticAnimation(double initVelocity, double initPosition);

    opened by qidianli 0
  • headerSliver高度超过半屏后,下拉会触发overscroll

    headerSliver高度超过半屏后,下拉会触发overscroll

    视频demo中,手指在屏幕上半部分缓慢下拉时,触发了overscroll

    https://user-images.githubusercontent.com/7556666/195525206-378ce1da-8719-4c41-85ba-a3771072f197.mp4

    环境 Flutter 版本2.10.5 Android设备,iOS没问题

    尝试把 https://github.com/fluttercandies/extended_nested_scroll_view/blob/master/lib/src/extended_nested_scroll_view.dart#L1300 remainingDelta > 0.0 改成 remainingDelta > precisionErrorTolerance,问题不再出现了,不知是否是这里的问题

    demo.zip

    opened by zhao0 2
  • flutter master分支的BallisticScrollActivity类需要4个参数了,直接编译不过

    flutter master分支的BallisticScrollActivity类需要4个参数了,直接编译不过

    extended_nested_scroll_view-5.1.3/lib/src/extended_nested_scroll_view.dart:1607:39: Error: Too few positional arguments: 4 required, 3 given. return BallisticScrollActivity(this, simulation, context.vsync);

    class BallisticScrollActivity extends ScrollActivity { /// Creates an activity that animates a scroll view based on a [simulation]. /// /// The [delegate], [simulation], and [vsync] arguments must not be null. BallisticScrollActivity( super.delegate, Simulation simulation, TickerProvider vsync, this.shouldIgnorePointer, ) { _controller = AnimationController.unbounded( debugLabel: kDebugMode ? objectRuntimeType(this, 'BallisticScrollActivity') : null, vsync: vsync, ) ..addListener(_tick) ..animateWith(simulation) .whenComplete(_end); // won't trigger if we dispose _controller first }

    master breaking change 
    opened by caihua 6
  • 滚动时报错

    滚动时报错

    ════════ Exception caught by animation library ═════════════════════════════════ The following assertion was thrown while notifying listeners for AnimationController: 'package:extended_nested_scroll_view/src/extended_nested_scroll_view.dart': Failed assertion: line 1760 pos 9: 'result': is not true. package:extended_nested_scroll_view/src/extended_nested_scroll_view.dart:1760

    When the exception was thrown, this was the stack #2 _NestedOuterBallisticScrollActivity.applyMoveTo package:extended_nested_scroll_view/src/extended_nested_scroll_view.dart:1760 #3 BallisticScrollActivity._tick package:flutter/…/widgets/scroll_activity.dart:553 #4 AnimationLocalListenersMixin.notifyListeners package:flutter/…/animation/listener_helpers.dart:155 #5 AnimationController._tick package:flutter/…/animation/animation_controller.dart:830 #6 Ticker._tick package:flutter/…/scheduler/ticker.dart:238 #7 SchedulerBinding._invokeFrameCallback package:flutter/…/scheduler/binding.dart:1146 #8 SchedulerBinding.handleBeginFrame. package:flutter/…/scheduler/binding.dart:1059

    opened by muchenfine 1
  • 设置过ExtendedVisibilityDetector uniqueKey 后 控制台一直打印 is visible

    设置过ExtendedVisibilityDetector uniqueKey 后 控制台一直打印 is visible

    I/flutter ( 2809): [<'AIssue2'>] is visible 2 I/flutter ( 2809): [<'ASpotCheck1'>] is visible 3 I/flutter ( 2809): [<uction0'>] is visible 2 I/flutter ( 2809): [<e2'>] is visible 2 I/flutter ( 2809): [<'duction0'>] is visible 2 I/flutter ( 2809): [<'sue2'>] is visible 2 I/flutter ( 2809): [<'oduction0'>] is visible 2 I/flutter ( 2809): [<'heck1'>] is visible 32 I/flutter ( 2809): [<'Issue2'>] is visible

    opened by muchenfine 7
Owner
FlutterCandies
Custom Flutter candies (packages) for you to build your Flutter app easily. Enjoy it!
FlutterCandies
Displays a highly customizable week view (or day view) which is able to display events, to be scrolled, to be zoomed-in & out and a lot more !

Displays a highly customizable week view (or day view) which is able to display events, to be scrolled, to be zoomed-in & out and a lot more !

Hugo Delaunay 196 Dec 2, 2022
A collection of pixel-perfect iOS-styled components and properties for Flutter, following the official guidelines.

cupertinew ⚠️ Experimental and work in progress ⚠️ A collection of pixel-perfect iOS-styled components and properties for Flutter, following the offic

null 30 Nov 10, 2022
Material io ext - A collection of extensions for creating widgets following material.io guidelines

material_io_ext It is a collection of extensions for creating widgets following

null 3 Jan 28, 2022
A flutter carousel widget, support infinite scroll, and custom child widget.

carousel_slider A carousel slider widget. Features Infinite scroll Custom child widgets Auto play Supported platforms Flutter Android Flutter iOS Flut

Bart T 1 Nov 25, 2021
Custom bottom sheet widget, that can resize by drag and then scroll.

Bottom Sheet This package is part of the SurfGear toolkit made by Surf. About Custom bottom sheet widget that can be resized in response to drag gestu

Surf 92 Dec 16, 2022
A Flutter widget that moves according to a scroll controller.

flutter_parallax A Flutter widget that moves according to a scroll controller. Features Can contain any widget. Configurable parallax scroll direction

Romain Rastel 100 Dec 17, 2021
A sheet that aligns to the bottom of a widget and expands as scroll up.

slinky_view A sheet that aligns to the bottom of a widget and expands as scroll up. Getting started Add dependency. dependencies: slinky_view: ^1.0.

idonun 3 Nov 21, 2022
📸 Easy to use yet very customizable zoomable image widget for Flutter, Photo View provides a gesture sensitive zoomable widget.

?? 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.

Blue Fire 1.7k Jan 7, 2023
Similar to Weibo dynamics, WeChat circle of friends, nine grid view controls to display pictures. Support single big picture preview.

Similar to Weibo dynamics, WeChat circle of friends, nine grid view controls to display pictures. Support single big picture preview.

Flutter中国开源项目 296 Dec 28, 2022
A widget to provides horizontal or vertical multiple split view for Flutter.

Multi split view A widget to provides horizontal or vertical multiple split view for Flutter. Horizontal or vertical Configurable weight or size for e

Carlos Eduardo Leite de Andrade 63 Dec 28, 2022
A widget with side-by-side source code view.

A widget with side-by-side source code view. Extracted from the flutter-catalog open-source app.

xwei 23 Aug 29, 2022
Horizontal_calendar - Horizontal week view calendar pub for Flutter.

horizontal_calendar Easy to use, highly customizable horizontal calendar. Features Custom date range (First & Last Date) Single or up to x days select

SoluteLabs 74 Dec 19, 2022
PowerFileView - A powerful file view widget, support a variety of file types, such as Doc Eexcl PPT TXT PDF and so on, Android is implemented by Tencent X5, iOS is implemented by WKWebView.

PowerFileView - A powerful file view widget, support a variety of file types, such as Doc Eexcl PPT TXT PDF and so on, Android is implemented by Tencent X5, iOS is implemented by WKWebView.

Yao 8 Oct 22, 2022
A Flutter widget which synchronize a ScrollView and a custom tab view

scrollable_list_tabview A Flutter widget which synchronize a ScrollView and a custom tab view. The main idea is to create a custom tab view synchroniz

Aswanath C K 0 Apr 12, 2022
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 14 Dec 14, 2022
Extended theme - Extended themes for Flutter

Extended Theme This package will allow you to extend theming in Flutter so you c

Stephan E.G. Veenstra 5 Apr 21, 2022
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
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
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 NestedScrollView that supports outer scroller to top overscroll.

custom_nested_scroll_view A NestedScrollView that supports outer scroller to top overscroll. ?? Preview Web demo ?? Click Here ?? Problem NestedScroll

null 20 Nov 25, 2022