xuelongqy / flutter_easy_refresh

A flutter widget that provides pull-down refresh and pull-up load.
https://xuelongqy.github.io/flutter_easy_refresh/
MIT License
3.89k stars 633 forks source link

默认pageNum=1, 正在执行自动刷新。此时不停触发上拉加载更多,页数pageNum+1, 然后pageNum+1的数据显示在最前面, 也就是第二页的数据在最前面。 #785

Closed Nicholas86 closed 9 months ago

Nicholas86 commented 10 months ago

默认pageNum=1, 正在执行自动刷新。此时不停触发上拉加载更多,页数pageNum+1, 然后pageNum+1的数据显示在最前面, 也就是第二页的数据在最前面。

xuelongqy commented 10 months ago

你可以试试结合这个flutter_scrollview_observer。你的意思应该是列表定位,CustomScrollView有一个center的参数,不过你要进行很多额外的处理。这是一个Flutter层面的提问,不属于issue,建议你加群交流。

Nicholas86 commented 10 months ago

你可以试试结合这个flutter_scrollview_observer。你的意思应该是列表定位,CustomScrollView有一个center的参数,不过你要进行很多额外的处理。这是一个Flutter层面的提问,不属于issue,建议你加群交流。

可能是我没说清楚,导致了误解。重新表述下。 1、页面initState初始化方法中, 设置全局页数变量pageNum = 1, 不调用onRefresh() 2、设置refreshOnStart=true; 3、此时, 页面会出现下拉刷新文案,你的框架提供的 4、再疯狂上拉加载。上拉加载的方法里, 将全局页数变量pageNum+1; 5、按照以上步骤,测试发现,pageNum=1的数据源并没有请求、也没有请求成功,就直接去请求pageNum=2的数据了,并且pageNum=2的数据源请求成功、展示到页面上了。也就是说, pageNum=1的请求丢掉了。

全局页数变量: pageNum = 1;

late refreshController

List results = [];

initState() { super.initState(); pageNum = 1; refreshController = EasyRefreshController( controlFinishLoad: true, controlFinishRefresh: true, ); }

build() { return EasyRefresh( controller: refreshController, refreshOnStart: true, onRefresh: () async { await onRefresh(); }, onLoad: () async { await onLoad(); }, child: SizedBox( width: MediaQuery.sizeOf(context).width, height: MediaQuery.sizeOf(context).height, child: ListView.builder( padding: EdgeInsets.zero, itemBuilder: (context, index) { return Contain(); }, itemCount: results.length, ) ) ); }

onRefresh() async { pageNum = 1; try { var response = await ClientQuest.requestList( pageNum: 10, pageSize: pageNum);

/// 使用全局变量results, 接收服务端返回的list, 并setState()

  refreshController.finishRefresh(IndicatorResult.success);

  if (response.data.isEmpty) {
    refreshController.finishLoad(IndicatorResult.noMore);
  } 
} catch (error) {
  refreshController.finishRefresh(IndicatorResult.fail);
}

}

onLoad() async { pageNum += 1; try { var response = await ClientQuest.requestList( pageNum: 10, pageSize: pageNum); /// 使用全局变量results, 接收服务端返回的list, 并setState()

  if (response.data.isEmpty) {
    refreshController.finishLoad(IndicatorResult.noMore);
  } else {
    refreshController.finishLoad(IndicatorResult.success);
  }
} catch (error) {
  refreshController.finishLoad(IndicatorResult.fail);
} 

}

xuelongqy commented 10 months ago

意思是,首次刷新被打断了嘛?

Nicholas86 commented 10 months ago

意思是,首次刷新被打断了嘛?

我觉得是。你的下拉刷新自动刷新文案出来后,过一点点时间后,才执行onRefresh方法。在这一点点时间内,我疯狂上拉加载更多,那么, pageNum+1=2了, 此时请求的就是第二页数据了。第一页的请求在那一点点时间内,要么没发出去,要么,发出来被打断了。期待你的回复。

xuelongqy commented 10 months ago

好的,非常感谢,确实有这个问题。修复后,我会在此issue中回复

Nicholas86 commented 10 months ago

好的,非常感谢,确实有这个问题。修复后,我会在此issue中回复

这个库不错。不断向前,与时俱进。使这个库更完善、更成熟。

xuelongqy commented 9 months ago

3.3.3已修复

Nicholas86 commented 9 months ago

3.3.3已修复

👍🏻