Giter VIP home page Giter VIP logo

loading_more_list's Introduction

loading_more_list

A loading more list which supports ListView,GridView,WaterfallFlow and Slivers.

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

Language: English | 中文简体

Web demo for LoadingMoreList

Use

  • add library to your pubspec.yaml
dependencies:
  loading_more_list: any
  • import library in dart file
  import 'package:loading_more_list/loading_more_list.dart';

Prepare Data Collection

LoadingMoreBase is data collection for loading more. override loadData method to load your data. set hasMore to false when it has no more data.

class TuChongRepository extends LoadingMoreBase<TuChongItem> {
  int pageindex = 1;
  bool _hasMore = true;
  bool forceRefresh = false;
  @override
  bool get hasMore => (_hasMore && length < 30) || forceRefresh;

  @override
  Future<bool> refresh([bool clearBeforeRequest = false]) async {
    _hasMore = true;
    pageindex = 1;
    //force to refresh list when you don't want clear list before request
    //for the case, if your list already has 20 items.
    forceRefresh = !clearBeforeRequest;
    var result = await super.refresh(clearBeforeRequest);
    forceRefresh = false;
    return result;
  }

  @override
  Future<bool> loadData([bool isloadMoreAction = false]) async {
    String url = "";
    if (this.length == 0) {
      url = "https://api.tuchong.com/feed-app";
    } else {
      int lastPostId = this[this.length - 1].postId;
      url =
          "https://api.tuchong.com/feed-app?post_id=$lastPostId&page=$pageindex&type=loadmore";
    }
    bool isSuccess = false;
    try {
      //to show loading more clearly, in your app,remove this
      await Future.delayed(Duration(milliseconds: 500));

      var result = await HttpClientHelper.get(url);

      var source = TuChongSource.fromJson(json.decode(result.body));
      if (pageindex == 1) {
        this.clear();
      }
      for (var item in source.feedList) {
        if (item.hasImage && !this.contains(item) && hasMore) this.add(item);
      }

      _hasMore = source.feedList.length != 0;
      pageindex++;
      isSuccess = true;
    } catch (exception, stack) {
      isSuccess = false;
      print(exception);
      print(stack);
    }
    return isSuccess;
  }
}

Argument

almost of arguments are the same as official.

following arguments are made for loading more.

ListConfig and SliverListConfig

argument description default
itemBuilder The item builder of list. required
sourceList The source list of data which extends LoadingMoreBase. required
showGlowLeading Whether to show the overscroll glow on the side with negative scroll offsets. 0.0
showGlowTrailing Whether to show the overscroll glow on the side with positive scroll offsets. -
lastChildLayoutType Layout type of last child(loadmore/no more item). LastChildLayoutType.foot
extendedListDelegate The delegate for WaterfallFlow or ExtendedList. -
gridDelegate The delegate for GridView. -
indicatorBuilder widget builder for different loading state. IndicatorWidget
padding The amount of space by which to inset the child sliver for SliverListConfig -
childCountBuilder The builder to get child count, the input is sourceList.length -

Widget

LoadingMoreList

argument description default
listConfig ListConfig required
onScrollNotification Called when a ScrollNotification of the appropriate type arrives at this location in the tree. -

LoadingMoreSliverList

argument description default
sliverListConfig SliverListConfig required

LoadingMoreCustomScrollView

argument description default
onScrollNotification Called when a ScrollNotification of the appropriate type arrives at this location in the tree. -

ListView

            LoadingMoreList(
              ListConfig<TuChongItem>(
                itemBuilder: ItemBuilder.itemBuilder,
                sourceList: listSourceRepository,
                padding: EdgeInsets.all(0.0),
              ),
            ),

GridView

define GridView with gridDelegate argument.

            LoadingMoreList(
              ListConfig<TuChongItem>(
                itemBuilder: ItemBuilder.itemBuilder,
                sourceList: listSourceRepository,
                padding: EdgeInsets.all(0.0),
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2,
                  crossAxisSpacing: 3.0,
                  mainAxisSpacing: 3.0,
                ),
              ),
            ),

WaterfallFlow

define WaterfallFlow with waterfallFlowDelegate argument.

            LoadingMoreList(
              ListConfig<TuChongItem>(
                extendedListDelegate: SliverWaterfallFlowDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2,
                  crossAxisSpacing: 5,
                  mainAxisSpacing: 5,
                ),
                itemBuilder: _buildItem,
                sourceList: listSourceRepository,
                padding: EdgeInsets.all(5.0),
              ),
            ),

Sliver/CustomScrollView

following codes are show how to build loading more list within CustomScrollView.

      LoadingMoreCustomScrollView(
        slivers: <Widget>[
          SliverAppBar(
            pinned: true,
            title: Text("MultipleSliverDemo"),
          ),
          ///SliverList
          LoadingMoreSliverList(SliverListConfig<TuChongItem>(
            itemBuilder: ItemBuilder.itemBuilder,
            sourceList: listSourceRepository,
          )),
          SliverToBoxAdapter(
            child: Container(
              alignment: Alignment.center,
              child: Text("Next list"),
              color: Colors.blue,
              height: 100.0,
            ),
          ),
          ///SliverGrid
          LoadingMoreSliverList(
            SliverListConfig<TuChongItem>(
              itemBuilder: ItemBuilder.itemBuilder,
              sourceList: listSourceRepository1,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
                crossAxisSpacing: 3.0,
                mainAxisSpacing: 3.0,
              ),
            ),
          ),
          SliverPersistentHeader(
            delegate: CommonExtentSliverPersistentHeaderDelegate(
                Container(
                  alignment: Alignment.center,
                  child: Text("Pinned Content"),
                  color: Colors.red,
                ),
                100.0),
            pinned: true,
          ),
          ///SliverWaterfallFlow
          LoadingMoreSliverList(
            SliverListConfig<TuChongItem>(
              itemBuilder: buildWaterfallFlowItem,
              sourceList: listSourceRepository2,
              padding: EdgeInsets.symmetric(horizontal: 5.0),
              extendedListDelegate: SliverWaterfallFlowDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
                crossAxisSpacing: 5,
                mainAxisSpacing: 5,
              ),
            ),
          ),
        ],
      ),

IndicatorStatus

define loading status with indicatorBuilder argument.

        enum IndicatorStatus {
          None,
          LoadingMoreBusying,
          FullScreenBusying,
          Error,
          FullScreenError,
          NoMoreLoad,
          Empty
        }
      LoadingMoreList(
        ListConfig<TuChongItem>(
          itemBuilder: ItemBuilder.itemBuilder,
          sourceList: listSourceRepository,
          indicatorBuilder: _buildIndicator,
          padding: EdgeInsets.all(0.0),
        ),
      ),

  //you can use IndicatorWidget or build yourself widget
  //in this demo, we define all status.
  Widget _buildIndicator(BuildContext context, IndicatorStatus status) {
    //if your list is sliver list ,you should build sliver indicator for it
    //isSliver=true, when use it in sliver list
    bool isSliver = false;

    Widget widget;
    switch (status) {
      case IndicatorStatus.None:
        widget = Container(height: 0.0);
        break;
      case IndicatorStatus.LoadingMoreBusying:
        widget = Row(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(right: 5.0),
              height: 15.0,
              width: 15.0,
              child: getIndicator(context),
            ),
            Text("正在加载...不要着急")
          ],
        );
        widget = _setbackground(false, widget, 35.0);
        break;
      case IndicatorStatus.FullScreenBusying:
        widget = Row(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(right: 0.0),
              height: 30.0,
              width: 30.0,
              child: getIndicator(context),
            ),
            Text("正在加载...不要着急")
          ],
        );
        widget = _setbackground(true, widget, double.infinity);
        if (isSliver) {
          widget = SliverFillRemaining(
            child: widget,
          );
        } else {
          widget = CustomScrollView(
            slivers: <Widget>[
              SliverFillRemaining(
                child: widget,
              )
            ],
          );
        }
        break;
      case IndicatorStatus.Error:
        widget = Text(
          "好像出现了问题呢?",
        );
        widget = _setbackground(false, widget, 35.0);

        widget = GestureDetector(
          onTap: () {
            listSourceRepository.errorRefresh();
          },
          child: widget,
        );

        break;
      case IndicatorStatus.FullScreenError:
        widget = Text(
          "好像出现了问题呢?",
        );
        widget = _setbackground(true, widget, double.infinity);
        widget = GestureDetector(
          onTap: () {
            listSourceRepository.errorRefresh();
          },
          child: widget,
        );
        if (isSliver) {
          widget = SliverFillRemaining(
            child: widget,
          );
        } else {
          widget = CustomScrollView(
            slivers: <Widget>[
              SliverFillRemaining(
                child: widget,
              )
            ],
          );
        }
        break;
      case IndicatorStatus.NoMoreLoad:
        widget = Text("没有更多的了。。不要拖了");
        widget = _setbackground(false, widget, 35.0);
        break;
      case IndicatorStatus.Empty:
        widget = EmptyWidget(
          "这里是空气!",
        );
        widget = _setbackground(true, widget, double.infinity);
        if (isSliver) {
          widget = SliverToBoxAdapter(
            child: widget,
          );
        } else {
          widget = CustomScrollView(
            slivers: <Widget>[
              SliverFillRemaining(
                child: widget,
              )
            ],
          );
        }
        break;
    }
    return widget;
  }

CollectGarbage

track the indexes are collect, you can collect garbage at that monment(for example Image cache)

more detail

        LoadingMoreList(
          ListConfig<TuChongItem>(
            extendedListDelegate: ExtendedListDelegate(
              collectGarbage: (List<int> indexes) {
                ///collectGarbage
              },
            ),
          ),
        ),

ViewportBuilder

track the indexes go into the viewport, it's not include cache extent.

        LoadingMoreList(
          ListConfig<TuChongItem>(
            extendedListDelegate: ExtendedListDelegate(
              viewportBuilder: (int firstIndex, int lastIndex) {
                print('viewport : [$firstIndex,$lastIndex]');
              },
            ),
          ),
        ),

LastChildLayoutType

build lastChild as special child in the case that it is loadmore/no more item.

        enum LastChildLayoutType {
        /// as default child
        none,

        /// follow max child trailing layout offset and layout with full cross axis extent
        /// last child as loadmore item/no more item in [ExtendedGridView] and [WaterfallFlow]
        /// with full cross axis extend
        fullCrossAxisExtent,

        /// as foot at trailing and layout with full cross axis extend
        /// show no more item at trailing when children are not full of viewport
        /// if children is full of viewport, it's the same as fullCrossAxisExtent
        foot,
        }

CloseToTrailing

when reverse property of List is true, layout is as following. it likes chat list, and new session will insert to zero index. but it's not right when items are not full of viewport.

     trailing
-----------------
|               |
|               |
|     item2     |
|     item1     |
|     item0     |
-----------------
     leading

to solve it, you could set closeToTrailing to true, layout is as following. support [ExtendedGridView],[ExtendedList],[WaterfallFlow]. and it also works when reverse is flase, layout will close to trailing.

     trailing
-----------------
|     item2     |
|     item1     |
|     item0     |
|               |
|               |
-----------------
     leading
      LoadingMoreList(
        ListConfig<TuChongItem>(
          extendedListDelegate: ExtendedListDelegate(
            closeToTrailing: true
          ),
        ),
      ),

loading_more_list's People

Contributors

alexv525 avatar comerc avatar zmtzawqlp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

loading_more_list's Issues

[Bug report] 建议去掉indicator_widget 中的backgroundColor

Content

  1. 首先这个backgroundColor 没地方用. 我搜了下,貌似没用

  2. 但是没用,它自带了个buff, 不传入,它背景色为Colors.grey[200], 就会出现,当主题为dark黑色时, 它背景为灰色, 很蛋疼

  Widget _setbackground(bool full, Widget widget, double height) {
    widget = Container(
        width: double.infinity,
        height: height,
        child: widget,
        color: backgroundColor ?? Colors.grey[200],
        alignment: Alignment.center);
    return widget;
  }

https://github.com/fluttercandies/loading_more_list/blob/9afe699fbd49f8793f319a40a672d6a8f455a9dd/lib/src/indicator_widget.dart#L160C9-L160C14

@zmtzawqlp 大佬你觉得呢?

瀑布流布局异常

  • Flutter 版本:1.22.6

  • 插件版本:3.2.0

  • 机型:iPhone xs / 小米 10

  • 重现步骤

修改TuChongRepository类的loadData方法,第一页加载一条,第二页加载4条

Future<bool> loadData([bool isloadMoreAction = false]) async { String url = ''; if (isEmpty) { url = 'https://api.tuchong.com/feed-app'; } else { final int lastPostId = this[length - 1].postId; url = 'https://api.tuchong.com/feed-app?post_id=$lastPostId&page=$_pageIndex&type=loadmore'; } bool isSuccess = false; try { List<TuChongItem> feedList; feedList = mockSource.feedList.toList(); if (_pageIndex == 1) { clear(); } if (_pageIndex == 1) { add(feedList[0]); } else { add(feedList[0]); add(feedList[0]); add(feedList[0]); add(feedList[0]); } _pageIndex++; _hasMore = _pageIndex <= 2; isSuccess = true; } catch (exception, stack) { isSuccess = false; print(exception); print(stack); } return isSuccess; }

  • 导致的结果:瀑布流布局异常,第二列的第一条未顶到第一列上
    image

  • 期望结果:上图中第二列数据的第一条放到第一列的第二条

[Bug report] 当GridViewDemo中开启reverse和closeToTrailing时,如果loadmore中的数据源过少,会触发断言。

Version

6.0.0

Platforms

Android, iOS

Device Model

模拟器

flutter info

• Flutter version 3.16.1 on channel stable 
    • Engine revision 22b600f240
    • Dart version 3.2.1

How to reproduce?

当GridViewDemo中开启reverse和closeToTrailing时,如果loadmore中的数据源过少,会触发断言。

Logs

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

Example code (optional)

example里的GridViewDemo加上
`        reverse: true,
        extendedListDelegate: ExtendedListDelegate(closeToTrailing: true),`
TuChongRepository的loadData中
`      for (final TuChongItem item in feedList!) {
        if (item.hasImage && !contains(item) && hasMore) {
          add(item);
         // 提前退出
          break;
        }
      }`

Contact

No response

Starting values

Is it possible to have starting values in a list? i.e. values that have been already fetched. etc.

APP刷新时异常

APP刷新时 列表也会刷新 然后异常

IndexedStack
   xxxWidget
      for(...)
          LoadingMoreList
   xxxWidget
      for(...)
          LoadingMoreList
   LoadingMoreSliverList
  

Ctrl + S 热重载 和 Get.updateLocal() 所有列表都会刷新 异常发生于LoadingMoreSliverList

终端输出
The following RangeError was thrown building:
RangeError (index): Invalid value: Valid value range is empty: 1

When the exception was thrown, this was the stack: 
#0      List.[] (dart:core-patch/growable_array.dart:260:36)
#1      LoadingMoreBase.[] (package:loading_more_list_library/src/loading_more_list_library.dart:26:37)
#2      LoadingMoreListConfig.buildItem (package:loading_more_list/src/list_config/loading_more_list_config.dart:144:17)
#3      SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:457:22)
#4      SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1215:28)
#5      SliverMultiBoxAdaptorElement.performRebuild.processElement (package:flutter/src/widgets/sliver.dart:1148:67)
#6      Iterable.forEach (dart:core/iterable.dart:279:35)
#7      SliverMultiBoxAdaptorElement.performRebuild (package:flutter/src/widgets/sliver.dart:1192:24)
#8      SliverMultiBoxAdaptorElement.update (package:flutter/src/widgets/sliver.dart:1126:7)
#9      Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#10     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#11     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#12     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#13     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#14     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#15     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#16     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#17     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#18     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#19     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#20     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#21     _ViewportElement.update (package:flutter/src/widgets/viewport.dart:228:11)
#22     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#23     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#24     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#25     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#26     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#27     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#28     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#29     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#30     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#32     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#33     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#34     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#35     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#36     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#37     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#39     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#40     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#41     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#42     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#43     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#45     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#46     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#47     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#48     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#49     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#50     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#51     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#52     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#53     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#54     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#55     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#56     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#57     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#58     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#59     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#60     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#61     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#62     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#63     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#64     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#65     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#66     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#67     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#69     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#70     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#71     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#72     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#73     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#74     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#75     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#77     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#78     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#79     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#80     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#81     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#82     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#83     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#84     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#85     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#86     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#87     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#88     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#89     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#90     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#91     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#92     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#93     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#94     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#95     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#96     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#97     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#98     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#99     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#100    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#101    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#102    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#103    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#104    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#105    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#106    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#107    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#108    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#109    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#110    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#111    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#112    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#113    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#114    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#115    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#116    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#117    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#118    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#119    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#120    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#121    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#122    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#123    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#124    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#125    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#126    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#127    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#128    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#129    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#130    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#131    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#132    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#133    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#134    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#135    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#136    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#137    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#138    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#139    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#140    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#141    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#142    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#143    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#144    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#145    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#146    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#147    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#148    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#149    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#150    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#151    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#152    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#153    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#154    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#155    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#156    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#157    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#158    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#159    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#160    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#161    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#162    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#163    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#164    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#165    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#166    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#167    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#168    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#169    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#170    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#171    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#172    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#173    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#174    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2578:33)
#175    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
#176    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#177    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1145:15)
#178    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
#179    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:863:7)
(elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
====================================================================================================

======== Exception caught by widgets library =======================================================
The following RangeError was thrown building:
RangeError (index): Invalid value: Valid value range is empty: 2

When the exception was thrown, this was the stack: 
#0      List.[] (dart:core-patch/growable_array.dart:260:36)
#1      LoadingMoreBase.[] (package:loading_more_list_library/src/loading_more_list_library.dart:26:37)
#2      LoadingMoreListConfig.buildItem (package:loading_more_list/src/list_config/loading_more_list_config.dart:144:17)
#3      SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:457:22)
#4      SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1215:28)
#5      SliverMultiBoxAdaptorElement.performRebuild.processElement (package:flutter/src/widgets/sliver.dart:1148:67)
#6      Iterable.forEach (dart:core/iterable.dart:279:35)
#7      SliverMultiBoxAdaptorElement.performRebuild (package:flutter/src/widgets/sliver.dart:1192:24)
#8      SliverMultiBoxAdaptorElement.update (package:flutter/src/widgets/sliver.dart:1126:7)
#9      Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#10     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#11     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#12     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#13     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#14     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#15     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#16     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#17     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#18     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#19     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#20     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#21     _ViewportElement.update (package:flutter/src/widgets/viewport.dart:228:11)
#22     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#23     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#24     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#25     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#26     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#27     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#28     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#29     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#30     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#32     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#33     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#34     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#35     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#36     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#37     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#39     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#40     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#41     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#42     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#43     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#45     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#46     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#47     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#48     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#49     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#50     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#51     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#52     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#53     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#54     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#55     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#56     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#57     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#58     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#59     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#60     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#61     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#62     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#63     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#64     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#65     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#66     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#67     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#69     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#70     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#71     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#72     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#73     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#74     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#75     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#77     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#78     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#79     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#80     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#81     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#82     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#83     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#84     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#85     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#86     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#87     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#88     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#89     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#90     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#91     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#92     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#93     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#94     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#95     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#96     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#97     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#98     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#99     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#100    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#101    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#102    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#103    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#104    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#105    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#106    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#107    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#108    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#109    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#110    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#111    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#112    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#113    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#114    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#115    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#116    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#117    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#118    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#119    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#120    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#121    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#122    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#123    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#124    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#125    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#126    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#127    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#128    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#129    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#130    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#131    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#132    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#133    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#134    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#135    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#136    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#137    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#138    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#139    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#140    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#141    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#142    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#143    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#144    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#145    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#146    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#147    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#148    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#149    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#150    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#151    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#152    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#153    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#154    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#155    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#156    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#157    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#158    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#159    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#160    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#161    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#162    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#163    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#164    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#165    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#166    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#167    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#168    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#169    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#170    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#171    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#172    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#173    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#174    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2578:33)
#175    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
#176    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#177    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1145:15)
#178    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
#179    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:863:7)
(elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
====================================================================================================

调用LoadingMoreBase的refresh()方法时不会自动清除数据

@OverRide
@mustCallSuper
Future refresh([bool notifyStateChanged = false]) async {
if (notifyStateChanged) {
this.clear();
indicatorStatus = IndicatorStatus.fullScreenBusying;
onStateChanged(this);
}
return await _innerloadData();
}

在源码中如果notifyStateChanged = false,就不会调用 this.clear();这行代码,需要自行清除。但是我只是想不显示IndicatorStatus.fullScreenBusying。场景是下拉刷新时,数据请求完毕才更新UI;

if return list is empty, get a error

My Api would return [].it is would get a erro. I try it in your example, it is happen alose.

  • tu_chong_repository.dart
    Making source.feedList to [] ,then getting a error
// in tu_chong_repository.dart
var result = await HttpClientHelper.get(url);

      var source = TuChongSource.fromJson(json.decode(result.body));
      if (pageindex == 1) {
        this.clear();
      }
      source.feedList = []; /// <----------------I add
      for (var item in source.feedList) {
        if (item.hasImage && !this.contains(item) && hasMore) this.add(item);
      }

error

════════ Exception caught by rendering library ═════════════════════════════════
RenderBox was not laid out: RenderConstrainedBox#5723f relayoutBoundary=up2 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1687 pos 12: 'hasSize'
The relevant error-causing widget was
    LoadingMoreSliverList<TuChongItem> 
lib/demo/sliver_list_demo.dart:41
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
The method 'debugAssertIsValid' was called on null.
Receiver: null
Tried calling: debugAssertIsValid()
The relevant error-causing widget was
    LoadingMoreCustomScrollView 
lib/demo/sliver_list_demo.dart:34
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
The getter 'visible' was called on null.
Receiver: null
Tried calling: visible
The relevant error-causing widget was
    LoadingMoreCustomScrollView 
lib/demo/sliver_list_demo.dart:34
════════════════════════════════════════════

there is a compiler message

Compiler message:
../../../development/flutter/.pub-cache/git/extended_image_library-c005601d2aef37d3f76c33cf8e3c41768ed2fe6f/lib/src/extended_network_image_provider.dart:63:41: Error: Type 'DecoderCallback' not found.
ExtendedNetworkImageProvider key, DecoderCallback decode) {

list is empty

When I switch requests the LoadMoreList will show error .for this ,Invalid value: Valid value range is empty: 1
The solution is added the judgment where in Loading_more_base file,
this methods
@OverRide
T operator [](int index) {
// TODO: implement []
if(index<_array.length-1) {
return _array[index];
}
}

[Bug report] Using LoadingMoreList in the app result in a blank page with no logs

Version

6.0.0

Platforms

Android, iOS

Device Model

Iphone 6 (IOS 12), Android Emulator (SDK 34)

flutter info

[✓] Flutter (Channel stable, 3.19.1, on macOS 13.6.4 22G513 darwin-x64, locale en-US)
    • Flutter version 3.19.1 on channel stable at /Users/chym/Development/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision abb292a07e (3 months ago), 2024-02-20 14:35:05 -0800
    • Engine revision 04817c99c9
    • Dart version 3.3.0
    • DevTools version 2.31.1

[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
    • Android SDK at /Users/chym/Library/Android/sdk
    • Platform android-34, build-tools 34.0.0
    • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.9+0-17.0.9b1087.7-11185874)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 15.2)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 15C500b
    • CocoaPods version 1.15.2

[✓] Chrome - develop for the web
    • CHROME_EXECUTABLE = /Applications/Brave Browser.app/Contents/MacOS/Brave Browser

[✓] Android Studio (version 2023.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.9+0-17.0.9b1087.7-11185874)

[✓] VS Code (version 1.89.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.88.0

[✓] Connected device (4 available)
    • sdk gphone64 x86 64 (mobile) • emulator-5554                            • android-x64    • Android 14 (API 34) (emulator)
    • iPhone 6 abc (mobile)        • a1e11a41a0f0a7348db11fadcf5437eb404463cd • ios            • iOS 12.5.7 16H81
    • macOS (desktop)              • macos                                    • darwin-x64     • macOS 13.6.4 22G513 darwin-x64
    • Chrome (web)                 • chrome                                   • web-javascript • Brave Browser 124.1.65.114

[✓] Network resources
    • All expected network resources are available.

How to reproduce?

LoadingMoreSliverList<FeedItem>(SliverListConfig<FeedItem>(
      sourceList: widget.source,
      itemBuilder: (context, item, index) {
        return RunCard(item: item);
      },
    ))

result in blank page

Logs

No response

Example code (optional)

No response

Contact

No response

部分场景下无法正常使用,有复现demo

先上例子,不能触发loadData加载数据

import 'package:flutter/material.dart';
import 'package:loading_more_list/loading_more_list.dart';


class BugPage extends StatelessWidget {

  const BugPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: [
          SliverList(delegate: SliverChildBuilderDelegate((context, index) {
            return const Text("---");
          },childCount: 2)),
          const Bug()
        ],
      ),
    );
  }
}


class BugRespository extends LoadingMoreBase<String>{
  @override
  Future<bool> loadData([bool isloadMoreAction = false]) async  {
    print("加载数据");
    await Future.delayed(const Duration(seconds: 1));
    final datas = List.generate(20, (index) => 'index: ${length+index}');
    return true;
  }

}

class Bug extends StatelessWidget {
  const Bug({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print('build..');
    return LoadingMoreSliverList(SliverListConfig<String>(
      itemBuilder: (c,item,index)=>Text(item),
      sourceList: BugRespository()
    ));
  }
}

Padding for small list (important bug)

I have only one item in list, but can scroll list with padding size. It is bug related with my old pull request.

only one item in list:
Снимок экрана от 2020-07-12 18-49-16

with wrong scroll behavior:
Снимок экрана от 2020-07-12 18-49-44

code fragment:

    return extended.NestedScrollViewInnerScrollPositionKeyWidget(
      widget.scrollPositionKey,
      LoadingMoreCustomScrollView(
        showGlowLeading: false,
        rebuildCustomScrollView: true,
        physics: ClampingScrollPhysics(),
        slivers: [
          LoadingMoreSliverList(SliverListConfig<ItemModel>(
            extendedListDelegate:
                SliverWaterfallFlowDelegateWithFixedCrossAxisCount(
              crossAxisCount: crossAxisCount,
              crossAxisSpacing: 16,
              mainAxisSpacing: 32,
            ),
            itemBuilder: (BuildContext context, ItemModel item, int index) {
              return ShowcaseItem(
                item: item,
              );
            },
            sourceList: widget.sourceList,
            indicatorBuilder: _buildIndicator,
            padding: EdgeInsets.all(16), // !!!!
            lastChildLayoutType: LastChildLayoutType.foot,
          ))
        ],
      ),
    );

The argument type 'FFRouteSettings Function({Map<String, dynamic>? arguments, required String name})' can't be assigned to the parameter type 'FFRouteSettings Function({Map<String, dynamic>? arguments, required String name, Widget? notFoundWidget})'.

The argument type 'FFRouteSettings Function({Map<String, dynamic>? arguments, required String name})' can't be assigned to the parameter type 'FFRouteSettings Function({Map<String, dynamic>? arguments, required String name, Widget? notFoundWidget})'.

flutter sdk2.05
dart 2.3
java 16

ios闪退

定位了半天终于定位出来, 在ios的时候 LoadingMoreBase loadData异步在请求中, 然后我切换了tab, 这个页面被销毁, 请求回来了内部还是调用了addAll()之类的方法之后, ios会报内存异常, 然后直接闪退了

LoadingMoreCustomScrollView get a error while I just give a slivers

Widget build(BuildContext context) {
    DataFactory.clearAll();
    return 
    LoadingMoreCustomScrollView(
      slivers: <Widget>[
        // SliverAppBar(
        //     pinned: true,
        //     title: Text("MultipleSliverDemo"),
        //   ),
        LoadingMoreSliverList(
          SliverListConfig<ArticleListBean>(
        // LoadingMoreList(
            // ListConfig<ArticleListBean>(
              itemBuilder: (ctx,model,index)=>ArticleItem(
                // key: ValueKey(model.id),
                listkey: params['listkey'],
                data: model,
              ),
              sourceList: DataFactory<ArticleListBean>(params['api'])
            )
        )
      ],
    );
  }
  • error
The following assertion was thrown during a scheduler callback:
'package:flutter/src/rendering/viewport.dart': Failed assertion: line 1476 pos 12: 'center.parent == this': is not true.


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=BUG.md

When the exception was thrown, this was the stack
#2      RenderViewport.indexOfFirstChild 
package:flutter/…/rendering/viewport.dart:1476
#3      RenderViewportBase.debugDescribeChildren 
package:flutter/…/rendering/viewport.dart:790
#4      DiagnosticableTreeNode.getChildren 
package:flutter/…/foundation/diagnostics.dart:2839
#5      DiagnosticsNode.toJsonMap 
package:flutter/…/foundation/diagnostics.dart:1544
#6      DiagnosticsNode.toJsonList.<anonymous closure> 
package:flutter/…/foundation/diagnostics.dart:1606
...

Chat app, have things start at the bottom

Creating a chat app where things start at the bottom is hard to do with this package. the reverse: true feature makes the scroll direction weird.

However, can we get it so the data starts at the bottom from default?

Navigator.pop error

When I navigate to a page with this package using a Navigator.pop call to go back, I get a perpetual loading screen and an indicator status of IndicatorStatus.fullScreenBusying

Any suggestions?

Add and remove from list

Hi thanks for the good work, If possible can we get the ability to add and remove from the list and also to refresh an item at a time say the fifth row in the list after edit or update.

我使用LoadingMoreCustomScrollView和waterflow,界面会出现问题

代码

Widget pushMovie() {
    return LoadingMoreSliverList(
            SliverListConfig<dynamic>(
              waterfallFlowDelegate: WaterfallFlowDelegate(
                crossAxisCount: 2,
                crossAxisSpacing: 5,
                mainAxisSpacing: 5,
              ),
              itemBuilder: buildWaterfallFlowItem,
              sourceList: listSourceRepository,
              padding: EdgeInsets.all(5.0),
              lastChildLayoutType: LastChildLayoutType.foot,
            ),
          );
  }
 @override
  Widget build(BuildContext context) {
return Scaffold(
        appBar: AppBar(title: Text('视频播放')),
        body: ValueListenableBuilder(
          valueListenable: likes.listenable(),
          builder: (context, Box<dynamic> box, _) {
            return LoadingMoreCustomScrollView(
              shrinkWrap: true,
            slivers: <Widget>[
                SliverList(delegate: SliverChildListDelegate([
                  AspectRatio(aspectRatio: 1.75, child: 
                    m3u8 == null
                          ? Container(
                              color: Colors.black,
                              child: Center(child: CircularProgressIndicator()))
                          : FijkView(
                              color: Colors.black,
                              player: player,
                              fit: FijkFit.contain,
                            )
                  ),
                  info(),
                  actions(),
                  Divider(),
                  xuanji(),
                  tv != null ? SizedBox(height: 10.0) : SizedBox(height: 0),
                  buildTagsWidget(),
                  Divider(),
                  MovieDetailPhotots(photos, video['_id']),
                  Divider(),
                ])),
                SliverToBoxAdapter(child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text('猜您喜欢'),
                ),),
                pushMovie(),
                // LikeViews(video['likes'], player)
              ],
            );
          })
        
        
        );
}

遇见的问题就是,刚点进去显示正常,但是下拉的时候可以一直下拉,这个时候页面就会变形。其他单loadingmore组件加载没问题,就这个播放页面会有问题,其他页面拉到底就拉不动了,这个页面还可以往下拉很多,就跟第二张截图一样,然后再上拉,页面就会变形,有时候甚至会变长一行重叠在一起。这个具体是什么问题?

截图:
QQ图片20200607142035
QQ图片20200607142047
QQ图片20200607142113
QQ图片20200607142129
QQ图片20200607142139

ListConfig中设置controller会导致划动异常

image
场景是NestedScrollViewDemo,多个tab,可能存在多个tab的list都有offset,当其中一个往上划动的时候会导致tabbar离开吸顶状态,这个时候当划动到原来有offset的tab时,我想让tab的offet归0,这样下拉刷新的时候就不会先tab list划动到顶,然后再去触发下拉刷新。 我的想法是在listConfig中设置 ScrollController,然后通过controler去设置list的offset为0。但是直接设置controller导致tab list会在tabbar非吸顶状态下,不和NestedScrollView联动。

Screen.Recording.2021-10-22.at.6.07.38.PM.mov

Custom empty.jpeg picture

Is there any way to customize empty.jpeg picture? Or if there is no way, can that feature be added?

itemBuilder返回的index改变后,没法区分占位index

Content

+ final int actualIndex = getActualIndex?.call(index) ?? index; return itemBuilder( context, - sourceList[getActualIndex?.call(index) ?? index], - index, + source.elementAt(actualIndex), + actualIndex, );
大佬这样改后,返回的index含义改动了啊。这样没有原始的index返回,当增加占位单元格的时候,没有办法区分占位index。

应提供更加简单的例子,方便入门

这是我看到的最棒的一个load more 插件。非常感谢作者。如果能提供更加简单的入门例子,就会方便学习和使用。下面是我做的一个例子,供参考:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:equatable/equatable.dart';

import 'package:uikit/util/export.dart' as util;  
import 'package:uikit/cmps/export.dart' as cmp;

class DemoPage601 extends StatefulWidget {
  @override
  _DemoPage601State createState() => _DemoPage601State();
}

class _DemoPage601State extends State<DemoPage601> {
  ListSource listSource;
  Completer<void> _refreshCompleter;

  @override
  void initState() {
    listSource = ListSource();
    _refreshCompleter = Completer<void>();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: cmp.MyAppBar(title: 'DemoPage601'),
      body: Container(
        child: Column(
          children: <Widget>[
            Text('header'),
            Expanded(
              child: cmp.PullToRefresh(
                postRefresh: () {
                  _refreshCompleter = Completer(); //重新开始
                },
                processing: () {
                  util.defer(util.delay3s, () {
                    listSource.refresh();
                    _refreshCompleter.complete();
                  });
                  return _refreshCompleter.future; //必须马上返回一个future
                },
                child: cmp.LoadingMoreList(
                  cmp.ListConfig<MyItem>(
                    itemBuilder: ItemBuilder.itemBuilder,
                    sourceList: listSource,
                    padding: EdgeInsets.all(10.0),
                  ),
                ), //child: LoadMore
              ), //child: PullToRefresh
            ), //Expanded
          ], //children
        ), //child:Column
      ), //body:Container
    ); //return
  } //build
} //class

class MyItem extends Equatable {
  MyItem({this.name}) : super([name]);
  String name;
}

class ListSource extends cmp.LoadingMoreBase<MyItem> {
  int pageIndex = 1;

  void _load() {
    List.generate(15, (v) => this.add(MyItem(name: 'index:$pageIndex-$v')));
  }

  @override
  bool get hasMore => pageIndex < 4;

  @override
  Future<bool> loadData([bool isloadMoreAction = false]) async {
    await Future.delayed(Duration(seconds: 0, milliseconds: 2000));
    _load();
    pageIndex++;
    return true;
  }

  @override
  Future<bool> refresh([bool notifyStateChanged = true]) async {
    pageIndex = 1;
    var result = await super.refresh(notifyStateChanged);
    return result;
  }
}

class ItemBuilder {
  static Widget itemBuilder(BuildContext context, MyItem item, int index) {
    return Container(
      child: Text(item.name),
      height: 40.0,
      alignment: Alignment.center,
    );
  }
}
//EOP

赋值出现类型不匹配

The argument type 'FFRouteSettings Function({Map<String, dynamic>? arguments, required String name})' can't be assigned to the parameter type 'FFRouteSettings Function({Map<String, dynamic>? arguments, required String name, Widget? notFoundWidget})'.

[Bug report] Looking up a deactivated widget's ancestor is unsafe.

Version

4.1.2

Platforms

dart, Android, iOS

Device Model

iPhone X iOS16

flutter info

admin@admindeMacBook-Pro app % flutter doctor -v
[!] Flutter (Channel stable, 3.10.5, on macOS 12.6.6 21G646 darwin-x64, locale zh-Hans-CN)
    • Flutter version 3.10.5 on channel stable at /Users/admin/development/flutter
    ! Warning: `dart` on your path resolves to /usr/local/Cellar/dart/3.0.4/libexec/bin/dart, which is not inside your current Flutter SDK checkout at
      /Users/admin/development/flutter. Consider adding /Users/admin/development/flutter/bin to the front of your path.
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 796c8ef792 (7 weeks ago), 2023-06-13 15:51:02 -0700
    • Engine revision 45f6e00911
    • Dart version 3.0.5
    • DevTools version 2.23.1
    • Pub download mirror https://pub.flutter-io.cn
    • Flutter download mirror https://storage.flutter-io.cn
    • If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades.

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
    • Android SDK at /Users/admin/Library/Android/sdk
    • Platform android-33, build-tools 33.0.2
    • ANDROID_HOME = /Users/admin/Library/Android/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 14C18
    • CocoaPods version 1.12.1

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2022.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)

[✓] VS Code (version 1.79.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.68.0

[✓] Connected device (3 available)
    • iPhone (4) (mobile) • 00008020-001C589A2203002E • ios            • iOS 16.3.1 20D67
    • macOS (desktop)     • macos                     • darwin-x64     • macOS 12.6.6 21G646 darwin-x64
    • Chrome (web)        • chrome                    • web-javascript • Google Chrome 115.0.5790.114

[!] Network resources             
    ✗ A network error occurred while checking "https://github.com/": Operation timed out

! Doctor found issues in 2 categories.

How to reproduce?

1、When you first go to the page which you use the widget, sometime it will show the error.
2、When you refresh your list, before the data getting, you hold the screen and then you will receive the error.

Logs

I/flutter ( 9284): Caught error: Looking up a deactivated widget's ancestor is unsafe.
I/flutter ( 9284): At this point the state of the widget's element tree is no longer stable.
I/flutter ( 9284): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
I/flutter ( 9284): Stack trace:
I/flutter ( 9284): package:flutter/src/widgets/framework.dart 4347:9 Element._debugCheckStateIsActiveForAncestorLookup.<fn>
I/flutter ( 9284): package:flutter/src/widgets/framework.dart 4361:6 Element._debugCheckStateIsActiveForAncestorLookup
I/flutter ( 9284): package:flutter/src/widgets/framework.dart 4396:12 Element.getElementForInheritedWidgetOfExactType
I/flutter ( 9284): package:flutter/src/widgets/inherited_model.dart 143:45 InheritedModel._findModels
I/flutter ( 9284): package:flutter/src/widgets/inherited_model.dart 191:5 InheritedModel.inheritFrom
I/flutter ( 9284): package:flutter/src/widgets/media_query.dart 1058:27 MediaQuery._maybeOf
I/flutter ( 9284): package:flutter/src/widgets/media_query.dart 1101:67 MediaQuery.maybeDevicePixelRatioOf
I/flutter ( 9284): package:flutter/src/widgets/scroll_position.dart 244:45 ScrollPosition.devicePixelRatio
I/flutter ( 9284): package:flutter/src/widgets/

Example code (optional)

No response

Contact

[email protected]

关于indicatorStatus的优化需求

在ListConfig配置里面的indicatorBuilder,对于某个status里面的widget不设置或设置为null时,则隐藏此widget的显示。
如:

switch (status) { 
......
case IndicatorStatus.LoadingMoreBusying:
    widget = null;
    break;
......

Example with flutter_bloc

Hello, can you provide an example for building a loading more list with flutter bloc library of Felix Angelov? I am trying to implement an ExtendedNestedScrollView where the tabs will have load more functionality, but I do not understand how you access the scroll notifications

~~~~

flutter: #276 Element.updateChild
package:flutter/…/widgets/framework.dart:2876
flutter: #277 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3935
flutter: #278 Element.rebuild
package:flutter/…/widgets/framework.dart:3721
flutter: #279 StatelessElement.update
package:flutter/…/widgets/framework.dart:3981
flutter: #280 Element.updateChild
package:flutter/…/widgets/framework.dart:2876
flutter: #281 SliverMultiBoxAdaptorElement.updateChild
package:flutter/…/widgets/sliver.dart:1181
flutter: #282 SliverMultiBoxAdaptorElement.performRebuild.processElement
package:flutter/…/widgets/sliver.dart:1113
flutter: #283 Iterable.forEach (dart:core/iterable.dart:277:30)
flutter: #284 SliverMultiBoxAdaptorElement.performRebuild
package:flutter/…/widgets/sliver.dart:1139
flutter: #285 SliverMultiBoxAdaptorElement.update
package:flutter/…/widgets/sliver.dart:1084
flutter: #286 Element.updateChild
package:flutter/…/widgets/framework.dart:2876

support bidirectional

Hello, can you provide the possibility of bidirectional scrolling?
That is, we scrolled up or down to load more!

AnimatedList support

Thank you for this awesome development.
Is it possible to apply your solution to AnimatedList?

I have to development a list with animations (if it possible with your lib), but If I understand correctly, right now I cannot achieve this. Is it correct?

Thank you for your answer.

小建议

能不能把图片换成风景图,都是美女图在公司调试起来好尴尬

LoadingMoreCustomScrollView add center attribute

CustomScrollView has Key? center attribute, please add this, tkx

use center eg.

///聊天内容展示
  Widget get chatsListWidget {
    return LoadingMoreCustomScrollView(
      reverse: true,
      controller: scroller,
      center: // <<< - todo add a center key
      slivers: [
        LoadingMoreSliverList(SliverListConfig<ChatItemData>(
          itemBuilder:renderChatLayoutItem,
          sourceList: repository,
          indicatorBuilder: (s, c) => kBuildIndicator(s, c, isSliver: true),
          extendedListDelegate: const ExtendedListDelegate(closeToTrailing: true),
          showNoMore: false
        )),
        SliverPadding(
          padding: EdgeInsets.zero,
          key: centerKey,
        ),
        LoadingMoreSliverList(SliverListConfig<ChatItemData>(
          itemBuilder: renderChatLayoutItem,
          sourceList: repositoryNew,
          showNoMore: false,
        ))
      ],
    );
  }

  ///旧版本
  Widget get oldVersion {
    return CustomScrollView(
      controller: scroller,
      center: centerKey,
      slivers: [
        // ChatUserDetailCard(model.txModel!.conversationID).toSliverWidget,
        //旧的聊天记录
        SliverPadding(
          padding: EdgeInsets.zero,
          key: centerKey,
        ),
        //新的聊天记录
        const Chats(),
      ],
    );
  }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.