Closed Dabbit-Chan closed 1 year ago
controller.resetFooter?
controller.resetFooter?
试过了,不行。我觉得是Footer里某个参数的问题,但是不知道具体是哪个参数。
EasyRefresh.noMoreLoad设置为true试试呢?
EasyRefresh.noMoreLoad设置为true试试呢?
还是不行。下面这个是可复现的一个demo,我觉得是ClassicFooter的问题
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
EasyRefresh.defaultHeaderBuilder = () {
return const ClassicHeader(
position: IndicatorPosition.locator,
);
};
EasyRefresh.defaultFooterBuilder = () {
return const ClassicFooter(
position: IndicatorPosition.locator,
);
};
return const MaterialApp(
title: '',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
DemoController demoCtrl = DemoController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: EasyRefresh(
controller: demoCtrl.easyRefreshController,
onRefresh: () {
demoCtrl.onRefresh().whenComplete(() {
setState(() {});
});
},
onLoad: () {
demoCtrl.onLoad().whenComplete(() {
setState(() {});
});
},
noMoreLoad: demoCtrl.noMoreLoad,
child: CustomScrollView(
slivers: [
const HeaderLocator.sliver(),
SliverList(delegate: SliverChildBuilderDelegate(
(_, index) => Container(
height: 50,
alignment: Alignment.center,
child: Text('${demoCtrl.list[index]}'),
),
childCount: demoCtrl.list.length,
)),
const FooterLocator.sliver(),
],
),
) // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
class DemoController {
bool noMoreLoad = false;
List<int> list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
EasyRefreshController easyRefreshController = EasyRefreshController(
controlFinishRefresh: true,
controlFinishLoad: true,
);
Future<void> onRefresh() async {
Future.delayed(const Duration(milliseconds: 1000), () {
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
easyRefreshController.finishRefresh();
});
}
Future<void> onLoad() async {
Future.delayed(const Duration(milliseconds: 1000), () {
if (list.length < 20) {
list.addAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
} else {
noMoreLoad = true;
}
easyRefreshController.resetFooter();
easyRefreshController.finishLoad();
});
}
}
EasyRefresh.noMoreLoad设置为true试试呢?
还是不行。下面这个是可复现的一个demo,我觉得是ClassicFooter的问题
import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { EasyRefresh.defaultHeaderBuilder = () { return const ClassicHeader( position: IndicatorPosition.locator, ); }; EasyRefresh.defaultFooterBuilder = () { return const ClassicFooter( position: IndicatorPosition.locator, ); }; return const MaterialApp( title: '', home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { DemoController demoCtrl = DemoController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: EasyRefresh( controller: demoCtrl.easyRefreshController, onRefresh: () { demoCtrl.onRefresh().whenComplete(() { setState(() {}); }); }, onLoad: () { demoCtrl.onLoad().whenComplete(() { setState(() {}); }); }, noMoreLoad: demoCtrl.noMoreLoad, child: CustomScrollView( slivers: [ const HeaderLocator.sliver(), SliverList(delegate: SliverChildBuilderDelegate( (_, index) => Container( height: 50, alignment: Alignment.center, child: Text('${demoCtrl.list[index]}'), ), childCount: demoCtrl.list.length, )), const FooterLocator.sliver(), ], ), ) // This trailing comma makes auto-formatting nicer for build methods. ); } } class DemoController { bool noMoreLoad = false; List<int> list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; EasyRefreshController easyRefreshController = EasyRefreshController( controlFinishRefresh: true, controlFinishLoad: true, ); Future<void> onRefresh() async { Future.delayed(const Duration(milliseconds: 1000), () { list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; easyRefreshController.finishRefresh(); }); } Future<void> onLoad() async { Future.delayed(const Duration(milliseconds: 1000), () { if (list.length < 20) { list.addAll([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); } else { noMoreLoad = true; } easyRefreshController.resetFooter(); easyRefreshController.finishLoad(); }); } }
两个Future.delayed前要加上await
我没太懂你的意思,和你需要的效果。默认情况下,如果是noMore的话,不会再触发加载,如果想要恢复调用resetFooter可以重制状态。如果你想取消这个限制,设置noMoreLoad=true,即使noMore也可以再触发加载,你不需要把它当成一个变量去操作
我想让这个“没有更多”在加载完成后缩回去,不显示出来。
我想让这个“没有更多”在加载完成后缩回去,不显示出来。
图片是在https://xuelongqy.github.io/flutter_easy_refresh/#/style/classic截的,我发现你这个也是一样,加载到没有更多的时候它也不会恢复回去
你需要把无限加载关掉
你需要把无限加载关掉
在哪里关??是哪个参数吗?
Footer.infiniteOffset设置为null
Footer.infiniteOffset设置为null
ok了,就是这个就是这个
虽然你的问题解决了,但是我感到很无奈。这个项目提供了完善的示例,每一个参数和方法都有注释,如果使用过示例或者看了参数的注释,就不会有这个问题。基于前面的点,我没有义务给每个人再讲一遍怎么去使用,而且是通过issue的方式,readme提供了交流群。而且描述问题时,尽量详细并提供代码,必要时可以提供图片或者视频,这样可以避免无效沟通,浪费大家的时间。在固定的issue中就有提示过,虽然没有提供模板,是因为希望能够自由提问,没有特意的限制,但是起码需要描述得详细易懂。希望大家互相理解,互相尊重
onLoad方法里已经配置了
easyRefreshCtrl.finishLoad(IndicatorResult.noMore);
,但是ClassicFooter仍然无法恢复。改用MaterialFooter可以,那么请问ClassicFooter里哪个参数能让他也恢复吗?或者说是该如何自定义一个能恢复的Footer?