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.9k stars 635 forks source link

请问ClassicFooter里有哪个参数可以使onLoad结束后恢复吗? #691

Closed Dabbit-Chan closed 1 year ago

Dabbit-Chan commented 1 year ago

onLoad方法里已经配置了easyRefreshCtrl.finishLoad(IndicatorResult.noMore);,但是ClassicFooter仍然无法恢复。改用MaterialFooter可以,那么请问ClassicFooter里哪个参数能让他也恢复吗?或者说是该如何自定义一个能恢复的Footer?

xuelongqy commented 1 year ago

controller.resetFooter?

Dabbit-Chan commented 1 year ago

controller.resetFooter?

试过了,不行。我觉得是Footer里某个参数的问题,但是不知道具体是哪个参数。

xuelongqy commented 1 year ago

EasyRefresh.noMoreLoad设置为true试试呢?

Dabbit-Chan commented 1 year ago

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();
    });
  }

}
Dabbit-Chan commented 1 year ago

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

xuelongqy commented 1 year ago

我没太懂你的意思,和你需要的效果。默认情况下,如果是noMore的话,不会再触发加载,如果想要恢复调用resetFooter可以重制状态。如果你想取消这个限制,设置noMoreLoad=true,即使noMore也可以再触发加载,你不需要把它当成一个变量去操作

Dabbit-Chan commented 1 year ago

image 我想让这个“没有更多”在加载完成后缩回去,不显示出来。

Dabbit-Chan commented 1 year ago

image 我想让这个“没有更多”在加载完成后缩回去,不显示出来。

图片是在https://xuelongqy.github.io/flutter_easy_refresh/#/style/classic截的,我发现你这个也是一样,加载到没有更多的时候它也不会恢复回去

xuelongqy commented 1 year ago

你需要把无限加载关掉

Dabbit-Chan commented 1 year ago

你需要把无限加载关掉

在哪里关??是哪个参数吗?

xuelongqy commented 1 year ago

Footer.infiniteOffset设置为null

Dabbit-Chan commented 1 year ago

Footer.infiniteOffset设置为null

ok了,就是这个就是这个

xuelongqy commented 1 year ago

虽然你的问题解决了,但是我感到很无奈。这个项目提供了完善的示例,每一个参数和方法都有注释,如果使用过示例或者看了参数的注释,就不会有这个问题。基于前面的点,我没有义务给每个人再讲一遍怎么去使用,而且是通过issue的方式,readme提供了交流群。而且描述问题时,尽量详细并提供代码,必要时可以提供图片或者视频,这样可以避免无效沟通,浪费大家的时间。在固定的issue中就有提示过,虽然没有提供模板,是因为希望能够自由提问,没有特意的限制,但是起码需要描述得详细易懂。希望大家互相理解,互相尊重